我正在尝试在一个函数中使用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_name”的配对,使用不同的“my_id”值,对于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对,并使用mapply函数与get_pairs函数一起使用。> 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名称的作用域有关,但我不确定。
另外,有没有不同/更有效的方法来完成此任务?我有一个带有第三个id“sample”的大型data.table,并且我需要获取每个样本的所有这些对(例如操作DT [样本==“sample_id”,])。我对data.table包还不熟悉,可能没有以最有效的方式使用它。
mapply
,如果您直接将DT
放入函数中而不是作为参数,则它可以工作(尽管这并不能解决“为什么它不起作用”的问题...) - Cathid
是否总是有两个names
? - Frank