gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:43:30 24 4
gpt4 key购买 nike

我正在尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com