【问题标题】:R data.table multi column recode/sub-assign [duplicate]R data.table多列重新编码/子分配[重复]
【发布时间】:2015-10-21 15:09:11
【问题描述】:

设DT为data.table:

DT<-data.table(V1=sample(10),
               V2=sample(10),
               ...
               V9=sample(10),)

有没有更好/更简单的方法来进行多列重新编码/子分配,如下所示:

DT[V1==1 | V1==7,V1:=NA]
DT[V2==1 | V2==7,V2:=NA]
DT[V3==1 | V3==7,V3:=NA]
DT[V4==1 | V4==7,V4:=NA]
DT[V5==1 | V5==7,V5:=NA]
DT[V6==1 | V6==7,V6:=NA]
DT[V7==1 | V7==7,V7:=NA]
DT[V8==1 | V8==7,V8:=NA]
DT[V9==1 | V9==7,V9:=NA]

变量名称是完全任意的,不一定有数字。 多列 (Vx:Vx) 和一个所有的重新编码模式 (NAME==1 | NAME==7, NAME:=something)。

此外,如何将多列子分配给其他东西。例如在 data.frame 样式中:

data[,columns][is.na(data[,columns])] <- a_value

【问题讨论】:

  • 这不是很data.tableish,但你可以简单地做is.na(DT) &lt;- (DT == 7 | DT == 1)(如果你的数据集不是太大的话)。

标签: r data.table na multiple-columns recode


【解决方案1】:

您可以使用set 替换多列中的值。基于?set,由于避免了[.data.table的开销,所以速度很快。我们使用for 循环遍历列,并将由“i”和“j”索引的值替换为“NA”

 for(j in seq_along(DT)) {
      set(DT, i=which(DT[[j]] %in% c(1,7)), j=j, value=NA)
  }

编辑:包括@David Arenburg 的 cmets。

数据

set.seed(24)
DT<-data.table(V1=sample(10), V2= sample(10), V3= sample(10))

【讨论】:

  • 如何使用for 循环将一组值替换为另一组值。例如,将c(1, 2, 3) 替换为c(4, 5, 6)?也就是把1换成4,把2换成5,把3换成6?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2015-03-21
  • 2015-10-20
  • 2021-06-14
  • 2021-06-22
相关资源
最近更新 更多