R:更新data.table中的列

时间:2015-02-08 18:44:27

标签: r data.table

我有以下结构的大数据表。

DT = data.table(Year=c("1993","1994"), "1"=c(NA,10), "2"=c(50, 40))

我想更新第2列" 1"。每个条目都带有" NA"应由" 0"代替。但要么

DT[is.na(1), 1:=0]

,也不

DT[is.na("1"), "1":=0]

的工作。问题是,列名称 - 除了"年份" - 是数字。当然,通过

setnames(DT, "1", "X1")
DT[is.na(X1), X1:=0]

我可以为这个小例子解决这个问题,但是列名称应该是数字,而巨大的data.table有超过50列。 有人有想法,我该怎么办?

1 个答案:

答案 0 :(得分:6)

您可以使用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))