【发布时间】:2014-10-23 15:48:58
【问题描述】:
我正在尝试使用 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 和 .SDCols,所以我可能用错了。 (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 来真正缩短运行时间。
谢谢,
克里希南
【问题讨论】:
-
samp[, lf5 := ifelse(loadfactor5 < 0, 0, loadfactor5)];在 SO 上搜索.SD以了解它是什么/做什么 -
我可以使用这个命令得到想要的结果。
-
@Krishnan,您能否自己回答并接受它,以便 Q 保持回答?谢谢。
标签: r data.table