Saya mengalami beberapa masalah dalam menggunakan data.table untuk penggabungan "ganda". Inilah yang ingin saya lakukan dalam bahasa Inggris sederhana. Saya memiliki beberapa data grafik/jaringan (yaitu, node dan tepi) dan saya ingin menggabungkan beberapa atribut simpul ke dalam data.tabel saya yang berisi tepinya. Bagaimana cara menggabungkan informasi tambahan dari data.table "simpul" ke dalam data.tabel "tepi" dua kali (sekali untuk kolom "Dari" dan sekali untuk kolom "Ke")? Penggabungan pertama berfungsi dengan mudah, tetapi pada penggabungan kedua, sepertinya saya tidak tahu cara memasukkan kolom yang baru digabungkan ke dalam DT pengembalian saya (yaitu, menulis pernyataan j yang benar. Berikut adalah beberapa contoh data menggambarkan:
set.seed(1)
nodes <- data.table( NodeID=c("N1", "N2", "N3", "N4", "N5"),
Name=c("Alice", "Bob", "Charlie", "David", "Emily"),
key="NodeID")
edges <- data.table( EdgeID=1:10,
From=sample(nodes$NodeID, 10, replace=TRUE),
To=sample(nodes$NodeID, 10, replace=TRUE))
setkey(edges, From, To)
Output yang saya inginkan adalah memiliki data.table baru yang menambahkan kolom "Nama" dari node data.table ke tepi data.table DUA KALI: sekali untuk kolom "Dari" dan sekali untuk kolom "Ke".
From EdgeID To FromName ToName
1: N1 10 N4 Alice David
2: N2 2 N1 Bob Alice
3: N2 1 N2 Bob Bob
4: N2 5 N4 Bob David
5: N3 3 N4 Charlie David
6: N4 9 N2 David Bob
...
Penggabungan pertama (untuk kolom "Dari") mudah: edge[nodes] Penggabungan kedua lebih sulit karena memerlukan argumen by terpisah (untuk kolom "Ke"). Namun menentukan argumen oleh memaksa Anda juga menentukan j. Namun bagaimana saya bisa merujuk ke kolom baru yang akan dibuat hanya setelah penggabungan selesai?
edges[nodes, ????, To]
Mungkin saya benar-benar keluar jalur di sini dan ada cara yang lebih baik untuk melakukannya.
edges_df <- as.data.frame(edges); nodes_df <- as.data.frame(nodes)
maka SQL mendukung gabungan multi-arah dan dapat digunakan seperti this:
library(sqldf); sqldf(pilih e.*, n1.Name sebagai FromName, n2.Name sebagai ToName dari edge_df e, node_df n1, node_df n2 pada e.'From' = n1.NodeID dan e.'To' = n2.NodeID)` - person G. Grothendieck   schedule 07.12.2013