r - 函数内多键子集data.table的混淆问题

标签 r data.table

我正在尝试使用 data.table 的参数子集(并对该子集应用均值)。基本上我将传递给函数两个键和第三个键的几个元素;这似乎令人困惑 R ,但该操作在函数环境之外完成时完全按预期工作。

这是一个基本上可以实现我想要做的事情的示例;它返回一个不正确的解决方案,而我自己的代码产生一个错误(粘贴在下面的文本):

set.seed(12345)
dt<-data.table(yr=rep(2000:2005,each=20),
               id=paste0(rep(rep(1:10,each=2),6)),
               deg=paste0(rep(1:2,60)),
               var=rnorm(120),
               key=c("yr","id","deg"))

fcn <- function(yr,ids,deg){
  dt[.(yr,ids,deg),mean(var)]
}

fcn(2004,paste0(1:3),"1")

这是给出了答案,但它完全错误(稍后会详细介绍)。如果我手动执行此操作,则没有问题:
> fcn(2004,paste0(1:3),"1")
[1] 0.1262586
> dt[yr==2004&id %in% paste0(1:3)&deg=="1",mean(var)]
[1] 0.4374115
> dt[.(2004,paste0(1:3),"1"),mean(var)]
[1] 0.4374115

为了破解发生了什么,我改变了fcn代码:
fcn <- function(yr,ids,deg){
  dt[.(yr,ids,deg),]
}

其中产生:
> fcn(2004,paste0(1:3),"1")
       yr id deg        var
  1: 2000  1   1  0.5855288
  2: 2000  2   2 -0.4534972
  3: 2000  3   1  0.6058875
  4: 2000  1   2  0.7094660
  5: 2000  2   1 -0.1093033
 ---                       
116: 2005  2   2 -1.3247553
117: 2005  3   1  0.1410843
118: 2005  1   2 -1.1562233
119: 2005  2   1  0.4224185
120: 2005  3   2 -0.5360480

基本上,fcn没有做子集!为什么会这样?真的很沮丧。

如果我只传递一个而不是三个,dt仅中键上的子集。奇怪的:
> fcn(2004,"1","1")
       yr id deg        var
  1: 2000  1   1  0.5855288
  2: 2000  1   2  0.7094660
  3: 2000  1   1  0.5855288
  4: 2000  1   2  0.7094660
  5: 2000  1   1  0.5855288
 ---                       
116: 2005  1   2 -1.1562233
117: 2005  1   1  0.2239254
118: 2005  1   2 -1.1562233
119: 2005  1   1  0.2239254
120: 2005  1   2 -1.1562233

但是如果我只将中间键传递给函数,它就可以正常工作:
fcn <- function(ids){
  dt[.(2004,ids,"1")]
}
> fcn(paste0(1:3))
     yr id deg        var
1: 2004  1   1  0.6453831
2: 2004  2   1 -0.3043691
3: 2004  3   1  0.9712207

最终编辑:问题已解决,但还是很高兴知道到底出了什么问题:

重命名参数:
fcn <- function(yyr,ids,ddeg){
  dt[.(yyr,ids,ddeg),mean(var)]
}

关于重新使用列名作为变量名的一些事情似乎导致了一个问题——但我仍然没有完全理解出了什么问题。

最佳答案

问题是您在 i-expression 中使用了列名,但希望它们是名称 data.table .您可以重命名函数中的变量名称,也可以构造连接 data.table外面然后使用单个名称的事实data.table将始终使用外部环境:

fcn <- function(yr,ids,deg){
  tmp = data.table(yr, ids, deg)
  dt[tmp, mean(var)]
}

fcn(2004, paste0(1:3), "1")
#[1] 0.4374115

FAQ 2.12-2.13。

关于r - 函数内多键子集data.table的混淆问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29930146/

相关文章:

R grepl : combine conditions

r - data.table 按连接表中的非 id 列分组

r - 合并较大数据的有效替代方法

r - 按绝对值排序

r - 调整连续变量的图例宽度

r - 使用 gtable 排列 ggplot 图(具有相同宽度的 grobs)以创建 2x2 布局

r - 我想添加数据框的递增连续列

r - 合并两个数据表但避免重复列

r - 通过数字位置的大向量非常快速地按顺序在数字位置列上对大数据框(或数据表)进行子集化

r - 按名称排列的每一行最近 21 天的事件