我试图使用参数data.table
子集(并将一个平均值应用于该子集)。基本上我会传递函数两个键和第三个键的几个元素;这似乎令人困惑R
,但该操作完全按照预期在功能环境之外完成。功能内多个子集子集data.table令人困惑的问题
下面是一个基本上得到我想要做的事情的例子;它返回一个解决方案,是不正确,而我自己的代码产生一个错误(文本粘贴以下):
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)°=="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)]
}
有关将列名重新用作变量名的问题引发了一个问题,看起来 - 但我仍然不完全明白出了什么问题。
粉笔这是需要写下来正确排除故障的情况。 – MichaelChirico