如何replace表中的NA值*选定的列*? data.frame,data.table

有很多关于取代NA值的post。 我知道可以用下面的表格/框架来replace新来港定居人士:

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)) 

这使:

  abc 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 

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

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

和:

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

哪个不行

我的data.table尝试,其中y<-data.table(x) ,显然永远不会工作:

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

我想通过is.na参数内的列,但显然不会工作。

我想在data.frame和data.table中做到这一点。 我的最终目标是在“a”和“b”中重新编码1:2到0:1,同时保持“c”的方式,因为它不是一个逻辑variables。 我有一堆列,所以我不想一个接一个地做。 而且,我只想知道如何做到这一点。

你有什么build议吗?

你可以做:

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

或更好(恕我直言),使用variables名称:

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

在这两种情况下, 1:2c("a", "b")都可以被预先定义的向量replace。

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

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

另外,正如David Arenburg指出的那样,你可以使用set (副作用 – 你可以在data.framedata.table上使用它):

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

不知道这是否更简洁,但是这个函数也会find并允许在data.table的选定列中replaceNA(或者你喜欢的任何值):

 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 

该函数创build满足input条件的选定列和行(单元格坐标)的matrix(在这种情况下,is.na == TRUE)。

对于一个特定的列,有一个select与sapply

 DF <- data.frame(A = letters[1:5], B = letters[6:10], C = c(2, 5, NA, 8, NA)) DF_NEW <- sapply(seq(1, nrow(DF)), function(i) ifelse(is.na(DF[i,3]) == TRUE, 0, DF[i,3])) DF[,3] <- DF_NEW DF 

这对我来说工作得很好

 DataTable DT = new DataTable(); DT = DT.AsEnumerable().Select(R => { R["Campo1"] = valor; return (R); }).ToArray().CopyToDataTable();