Sto cercando di utilizzare un data.table all'interno di una funzione e sto cercando di capire perché il mio codice non funziona. Ho un data.table come segue:I nomi delle colonne data.table non funzionano all'interno di una funzione
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
Sto cercando di creare tutte le coppie di "my_name" con diversi valori di "my_id", che per DT sarebbe:
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
ho una funzione per restituire tutte le coppie di "my_name" per una data coppia di valori di "my_id" che funziona come previsto.
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
Ora, voglio eseguire questa funzione per tutte le coppie di ID, che cerco di fare trovando tutte le coppie di ID e quindi utilizzando mapply con la funzione 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
Ancora, se provo a fare la stessa cosa senza un mapply, funziona.
get_pairs3(tid1[1],tid2[1],DT)
Var1 Var2
1 A C
2 B C
3 A D
4 B D
Perché questa funzione ha esito negativo solo se utilizzata all'interno di un mapping? Penso che questo abbia qualcosa a che fare con lo scopo dei nomi data.table, ma non ne sono sicuro.
In alternativa, esiste un modo diverso/più efficiente per eseguire questa attività? Ho un grande data.table con un terzo "campione" id e ho bisogno di ottenere tutte queste coppie per ogni campione (ad esempio, operando su DT [sample == "sample_id",]). Sono nuovo nel pacchetto data.table e potrei non utilizzarlo nel modo più efficiente.
Mi dispiace, non sono sicuro perché il mapply non funziona e quindi non ne ha parlato nella mia risposta. – Frank
per 'mapply', funziona se si mette' DT' direttamente nella funzione e non come parametro (sebbene non risolva la parte "perché non funziona" ...) – Cath
Ogni ID ha sempre esattamente due 'nomi'? – Frank