This question already has answers here:
Fastest way to replace NAs in a large data.table

(10个答案)


5年前关闭。




假设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)。

而且,如何将多列NA分配给其他对象。例如以data.frame样式:
data[,columns][is.na(data[,columns])] <- a_value

最佳答案

您可以使用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的评论。
数据
set.seed(24)
DT<-data.table(V1=sample(10), V2= sample(10), V3= sample(10))

关于R data.table多列重新编码/子分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31720734/

10-12 17:41