【问题标题】:R: Update a column in a data.tableR:更新 data.table 中的列
【发布时间】:2015-04-08 11:46:46
【问题描述】:

我有一个如下结构的大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]

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

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

我可以通过这个小例子来解决这个问题,但是列名应该是数字,而且巨大的 data.table 有 50 多列。 有没有人有想法,我必须做什么?

【问题讨论】:

  • DT[is.na(`1`), "1":=0 , with = FALSE]

标签: r data.table


【解决方案1】:

你可以使用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 的cmets,多列的有效方法是使用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))

【讨论】:

  • 如果有多个列,我会使用for-loopset()。不是replace(),因为它复制每一列只是为了替换NAs,这使得通过引用进行更新毫无意义。
猜你喜欢
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
相关资源
最近更新 更多