Я пытаюсь использовать data.table внутри функции, и я пытаюсь понять, почему мой код не работает. У меня есть data.table следующим образом:R 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_name» для данной пары значений «my_id», которая работает так, как ожидалось.
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
Теперь я хочу, чтобы выполнить эту функцию для всех пар идентификаторов, которые я пытаюсь сделать, находя все пары идентификаторов, а затем с помощью 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, но я не уверен.
В качестве альтернативы, существует ли другой эффективный способ выполнения этой задачи? У меня есть большая data.table с третьим идентификатором «sample», и мне нужно получить все эти пары для каждого образца (например, работать с DT [sample == "sample_id",]). Я новичок в пакете data.table, и я не могу использовать его наиболее эффективным способом.
К сожалению, я не уверен, о том, почему mapply не работает и поэтому не упоминал об этом в своем ответе. – Frank
для 'mapply', он работает, если вы поместите' DT' непосредственно в функцию, а не как параметр (хотя он не решает «почему это не работает» часть ...) – Cath
Имеет ли каждый 'id' всегда ровно два «имени»? – Frank