Data.table: [R-Forge#5222]当DT [,list(sum(non-.SD-col),lapply(.SD,mean)),by = ...,.SDcols = ...时“未找到”

创建于 2014-06-08  ·  12评论  ·  资料来源: Rdatatable/data.table

提交人:Matt Weller; 分配给:没人; R-Forge链接

当使用.SDcols (为了将函数应用于多个列),我无法使用以下语法引用原始表(v1)中的其他列:

dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1),  lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp,  : 
#   object 'v1' not found

当我使用c而不是list时,会发生类似的错误,显然在j子句中无法访问列v1。

我求助于以下包含v1列的代码,即使我不希望将其包含在lapply部分中,也必须在计算后将其删除。

sd.cols = c("v1","v2", "v3")
dt.out = dt[, c(sum.v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]

根据eddi在Stackoverflow上的说法,这是一个错误,他已要求我报告此错误。 我无法提供更多详细信息,因为我不确定他认为哪一部分是错误,请查看Arun接受的答案,随后他们的讨论将重点说明问题出在哪里。

是相关的SO帖子。

High bug

所有12条评论

另一个要更新的帖子: http :

有点晚了,但我的这个问题又增加了

我什至没有想到它是一个错误,通常我会为.SDcols提供其他必填字段,然后在j使用.SD[, !"total", with=FALSE]来排除不需要的列。

那是另一个很好的解决方法,我想知道使用dt$total的性能差异。 是的,在FR和bug(国际海事组织)之间的这种区分是很重要的。

再次撞到这个。 看起来这可能是非常重要的修复。 这个问题似乎与DT[, (deltaColsNewNames) := lapply(.SD, normalDelta, price), .SDcols = deltaColsNames]有关,可能可以解决

这是另一个有用的简单情况: http :

这是另一个遭受痛苦的简单情况: http :

修复后要更新的另一个: http :

耶! 我们现在可以这样做:

require(data.table)
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1),  lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
  #  grp v1  v2   v3
# 1:   2  7 4.5 12.5
# 2:   3 12 4.0 13.0
# 3:   1  9 3.5 13.5

更新了此处链接的所有SO帖子。 谢谢大家。

谢谢,@ arunsrinivasan。 我已经等了好几年了。

惊人的! 谢谢

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

jimhester picture jimhester  ·  3评论

tcederquist picture tcederquist  ·  3评论

DavidArenburg picture DavidArenburg  ·  3评论

andschar picture andschar  ·  3评论

arunsrinivasan picture arunsrinivasan  ·  3评论