在r data.table中使用条件语句

时间:2014-08-29 15:34:12

标签: r data.table

我正在尝试使用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来减少运行时间。

谢谢,

克里希南

2 个答案:

答案 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对于上述操作的速度有多快。