【问题标题】:Using conditional statements in r data.table在 r data.table 中使用条件语句
【发布时间】: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 &lt; 0, 0, loadfactor5)];在 SO 上搜索 .SD 以了解它是什么/做什么
  • 我可以使用这个命令得到想要的结果。
  • @Krishnan,您能否自己回答并接受它,以便 Q 保持回答?谢谢。

标签: r data.table


【解决方案1】:

答案由eddi 提供,为了完整起见,将其包含在此处。

samp[, lf5 := ifelse(loadfactor5 &lt; 0, 0, loadfactor5)]

【讨论】:

  • 我想问题的交换是使用“:=”而不是“=”。你也可以写 samp[, lf5 := loadfactor5*(loadfactor>=0)]
  • 您应该使用fifelse,它更快并且在 data.table >= 1.12.4 中实现
【解决方案2】:

另一种方式(我更喜欢这种方式,因为在我看来它更干净):

samp[, lf5 := 0]; samp[loadfactor5 > 0, lf5 := loadfactor5];

我将 data.table 与 90M 行的数据集一起使用;我一直对 data.table 对上述操作的速度感到惊讶。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2014-02-05
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 2015-09-12
    相关资源
    最近更新 更多