如何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:2
或c("a", "b")
都可以被预先定义的向量replace。
这将适用于你的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)
不知道这是否更简洁,但是这个函数也会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();