为了账号安全,请及时绑定邮箱和手机立即绑定

如何为选定列替换表中的NA值

/ 猿问

如何为选定列替换表中的NA值

千万里不及你 2019-11-27 10:37:43

关于替换NA值的帖子很多。我知道可以用以下内容替换下表/框架中的NA:


x[is.na(x)]<-0

但是,如果我想将其限制为仅某些列呢?让我给你看一个例子。


首先,让我们从数据集开始。


set.seed(1234)

x <- data.frame(a=sample(c(1,2,NA), 10, replace=T),

                b=sample(c(1,2,NA), 10, replace=T), 

                c=sample(c(1:5,NA), 10, replace=T))

这使:


    a  b  c

1   1 NA  2

2   2  2  2

3   2  1  1

4   2 NA  1

5  NA  1  2

6   2 NA  5

7   1  1  4

8   1  1 NA

9   2  1  5

10  2  1  1

好的,所以我只想将替换限制为列“ a”和“ b”。我的尝试是:


x[is.na(x), 1:2]<-0

和:


x[is.na(x[1:2])]<-0

哪个不起作用。


我的data.table尝试(where y<-data.table(x))显然是行不通的:


y[is.na(y[,list(a,b)]), ]

我想在is.na参数中传递列,但这显然行不通。


我想在data.frame和data.table中执行此操作。我的最终目标是将'a'和'b'中的1:2编码为0:1,同时保持'c'的原样,因为它不是逻辑变量。我有一堆专栏,所以我不想一个接一个地做。而且,我只想知道如何执行此操作。


你有什么建议吗?


查看完整描述

3 回答

?
蝴蝶刀刀

你可以做:


x[, 1:2][is.na(x[, 1:2])] <- 0

或更好(IMHO),请使用变量名称:


x[c("a", "b")][is.na(x[c("a", "b")])] <- 0

在这两种情况下,1:2或c("a", "b")都可以用预定义的向量替换。


查看完整回答
反对 2019-11-27
?
互换的青春

这将适用于您的data.table版本:


for (col in c("a", "b")) y[is.na(get(col)), (col) := 0]

另外,正如David Arenburg指出的那样,您可以使用set(附带好处-您可以在data.frame或上使用它data.table):


for (col in 1:2) set(x, which(is.na(x[[col]])), col, 0)


查看完整回答
反对 2019-11-27
?
红颜莎娜

不知道这是否更简洁,但是此函数还将在data.table的选定列中查找并允许替换NA(或您喜欢的任何值):


update.mat <- function(dt, cols, criteria) {

  require(data.table)

  x <- as.data.frame(which(criteria==TRUE, arr.ind = TRUE))

  y <- as.matrix(subset(x, x$col %in% which((names(dt) %in% cols), arr.ind = TRUE)))

  y

}

要应用它:


y[update.mat(y, c("a", "b"), is.na(y))] <- 0

该函数创建满足输入条件的所选列和行(单元格坐标)的矩阵(在这种情况下为is.na == TRUE)。


查看完整回答
反对 2019-11-27
  • 3 回答
  • 0 关注
  • 190 浏览

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信