gpt4 book ai didi

R data.table列名在函数中不起作用

转载 作者:行者123 更新时间:2023-12-04 06:58:56 24 4
gpt4 key购买 nike

我试图在函数中使用data.table,并且试图理解为什么我的代码失败。我有一个data.table如下:

DT <- data.table(my_name=c("A","B","C","D","E","F"),my_id=c(2,2,3,3,4,4))
> DT
my_name my_id
1: A 2
2: B 2
3: C 3
4: D 3
5: E 4
6: F 4

我正在尝试使用不同的“my_id”值创建所有“my_name”对,这对于DT来说是:
Var1 Var2    
A C
A D
A E
A F
B C
B D
B E
B F
C E
C F
D E
D F

我有一个函数可以针对给定的“my_id”值对返回所有“my_name”对,这可以按预期工作。
get_pairs <- function(id1,id2,tdt) {
return(expand.grid(tdt[my_id==id1,my_name],tdt[my_id==id2,my_name]))
}
> get_pairs(2,3,DT)
Var1 Var2
1 A C
2 B C
3 A D
4 B D

现在,我想对所有ID对执行此功能,我尝试通过找到所有ID对然后将getppairs函数与mapply一起使用来执行此功能。
> combn(unique(DT$my_id),2)
[,1] [,2] [,3]
[1,] 2 2 3
[2,] 3 4 4
tid1 <- combn(unique(DT$my_id),2)[1,]
tid2 <- combn(unique(DT$my_id),2)[2,]
mapply(get_pairs, tid1, tid2, DT)
Error in expand.grid(tdt[my_id == id1, my_name], tdt[my_id == id2, my_name]) :
object 'my_id' not found

同样,如果我尝试在没有mapply的情况下执行相同的操作,则它会起作用。
get_pairs3(tid1[1],tid2[1],DT)
Var1 Var2
1 A C
2 B C
3 A D
4 B D

为什么仅在mapply中使用此功能时才会失败?我认为这与data.table名称的范围有关,但是我不确定。

或者,是否有其他/更有效的方法来完成此任务?我有一个很大的data.table,它的第三个ID为“sample”,我需要为每个示例获取所有这些对(例如,在DT [sample ==“sample_id”,]上进行操作)。我是data.table包的新手,并且可能没有以最有效的方式使用它。

最佳答案

Why does this function fail only when used within an mapply? I think this has something to do with the scope of data.table names, but I'm not sure.



在这种情况下,函数失败的原因与作用域无关。 mapply对函数进行矢量化处理,它接受每个参数的每个元素并传递给函数。因此,在您的情况下, data.table元素为其列,因此 mapply传递了 my_name列而不是完整的 data.table

如果要将完整的 data.table传递给 mapply,则应使用 MoreArgs参数。然后您的函数将起作用:
res <- mapply(get_pairs, tid1, tid2, MoreArgs = list(tdt=DT), SIMPLIFY = FALSE)
do.call("rbind", res)
Var1 Var2
1 A C
2 B C
3 A D
4 B D
5 A E
6 B E
7 A F
8 B F
9 C E
10 D E
11 C F
12 D F

关于R data.table列名在函数中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31051922/

24 4 0