R:更新 data.table 中的列
R: Update a column in a data.table
我有一个大data.table如下结构
DT = data.table(Year=c("1993","1994"), "1"=c(NA,10), "2"=c(50, 40))
我想更新第二列“1”。每个带有 "NA" 的条目都应替换为“0”。但要么
DT[is.na(1), 1:=0]
也不
DT[is.na("1"), "1":=0]
工作。问题是,列名 - 除了 "Year" - 是数字。当然是通过
setnames(DT, "1", "X1")
DT[is.na(X1), X1:=0]
这个小例子我可以解决这个问题,但是列名必须是数字,而且巨大的data.table有超过50列。
有没有人有想法,我必须做什么?
你可以使用 backticks
DT[is.na(`1`), `1`:=0]
DT
# Year 1 2
#1: 1993 0 50
#2: 1994 10 40
如果有更多列,
nm1 <- names(DT1)[-1]
DT1[,(nm1):= lapply(.SD, function(x) replace(x, is.na(x), 0)), .SDcols=nm1]
DT1
# Year 1 2 3 4
#1: 1993 0 50 10 0
#2: 1994 10 40 0 4
或者根据@Arun 的评论,多列的有效方法是使用 set
。与 replace
方法相比,这通过引用更新。
for(j in 2:ncol(DT1)){
indx <- which(is.na(DT1[[j]]))
set(DT1, i=indx, j=j, value=0)
}
数据
DT1 <- data.table(Year=c("1993","1994"), "1"=c(NA,10),
"2"=c(50, 40), "3"=c(10, NA), "4"=c(NA, 4))
我有一个大data.table如下结构
DT = data.table(Year=c("1993","1994"), "1"=c(NA,10), "2"=c(50, 40))
我想更新第二列“1”。每个带有 "NA" 的条目都应替换为“0”。但要么
DT[is.na(1), 1:=0]
也不
DT[is.na("1"), "1":=0]
工作。问题是,列名 - 除了 "Year" - 是数字。当然是通过
setnames(DT, "1", "X1")
DT[is.na(X1), X1:=0]
这个小例子我可以解决这个问题,但是列名必须是数字,而且巨大的data.table有超过50列。 有没有人有想法,我必须做什么?
你可以使用 backticks
DT[is.na(`1`), `1`:=0]
DT
# Year 1 2
#1: 1993 0 50
#2: 1994 10 40
如果有更多列,
nm1 <- names(DT1)[-1]
DT1[,(nm1):= lapply(.SD, function(x) replace(x, is.na(x), 0)), .SDcols=nm1]
DT1
# Year 1 2 3 4
#1: 1993 0 50 10 0
#2: 1994 10 40 0 4
或者根据@Arun 的评论,多列的有效方法是使用 set
。与 replace
方法相比,这通过引用更新。
for(j in 2:ncol(DT1)){
indx <- which(is.na(DT1[[j]]))
set(DT1, i=indx, j=j, value=0)
}
数据
DT1 <- data.table(Year=c("1993","1994"), "1"=c(NA,10),
"2"=c(50, 40), "3"=c(10, NA), "4"=c(NA, 4))