我正在尝试使用data.table根据特定条件重新编码变量。我的原始数据集有大约30M的记录,并且所有变量创建后大约有130个变量。我使用了此处建议的方法:conditional statements in data.table (M1)以及此处data.table: Proper way to do create a conditional variable when column names are not known? (M2)
我的目标是获得以下代码的等价物,但使用data.table
是适用的samp$lf5 <- samp$loadfactor5
samp$lf5 <- with(samp, ifelse(loadfactor5 < 0, 0, lf5))
我承认我不太了解.SD和.SDC很好,所以我可能错了。来自(M1)和(M2)的代码和错误如下所示,示例数据集位于此处:http://goo.gl/Jp97Wn
(M1)
samp[,lf5 = if(loadfactor5 <0) 0 else loadfactor5]
错误消息
Error in `[.data.table`(samp, , lf5 = if (loadfactor5 < 0) 0 else loadfactor5) :
unused argument (lf5 = if (loadfactor5 < 0) 0 else loadfactor5)
当我这样做时:
samp[,list(lf5 = if(loadfactor5 <0) 0 else loadfactor5)]
它将lf5作为列表但不作为samp data.table的一部分提供,并且不会真正应用该条件,因为lf5仍然具有小于0的值。
(M2)
Col1 <- "loadfactor5"
Col2 <- "lf5"
setkeyv(samp,Col1)
samp[,(Col2) :=.SD,.SDCols = Col1][Col1<0,(Col2) := .SD, .SDcols = 0]
我收到以下错误
Error in `[.data.table`(samp, , `:=`((Col2), .SD), .SDCols = Col1) :
unused argument (.SDCols = Col1)
任何关于如何完成此任务的见解表示赞赏。我的数据集有30M记录,所以我希望使用data.table来减少运行时间。
谢谢,
克里希南
答案 0 :(得分:22)
eddi提供的答案,为了完整起见,此处包括在内。
samp[, lf5 := ifelse(loadfactor5 < 0, 0, loadfactor5)]
答案 1 :(得分:3)
另一种方式(我更喜欢,因为在我看来,它更干净):
samp[, lf5 := 0]; samp[loadfactor5 > 0, lf5 := loadfactor5];
我使用带有90M行数据集的data.table;我不断惊讶于data.table对于上述操作的速度有多快。