Saya punya data.tabel :
groups <- data.table(group = c("A", "B", "C", "D", "E", "F", "G"),
code_1 = c(2,2,2,7,8,NA,5),
code_2 = c(NA,3,NA,3,NA,NA,2),
code_3 = c(4,1,1,4,4,1,8))
group code_1 code_2 code_3
A 2 NA 4
B 2 3 1
C 2 NA 1
D 7 3 4
E 8 NA 4
F NA NA 1
G 5 2 8
Apa yang ingin saya capai, adalah untuk setiap kelompok untuk menemukan tetangga terdekat berdasarkan kode yang tersedia. Misalnya: Grup A memiliki grup tetangga langsung B, C karena kode_1 (kode_1 sama dengan 2 di semua grup) dan memiliki grup tetangga langsung D, E karena kode_3 (kode_3 sama dengan 4 di semua grup itu).
Apa yang saya coba adalah untuk setiap kode, dengan mengelompokkan kolom (grup) pertama berdasarkan kecocokan sebagai berikut:
groups$code_1_match = list()
for (row in 1:nrow(groups)){
set(groups, i=row, j="code_1_match", list(groups$group[groups$code_1[row] == groups$code_1]))
}
group code_1 code_2 code_3 code_1_match
A 2 NA 4 A,B,C,NA
B 2 3 1 A,B,C,NA
C 2 NA 1 A,B,C,NA
D 7 3 4 D,NA
E 8 NA 4 E,NA
F NA NA 1 NA,NA,NA,NA,NA,NA,...
G 5 2 8 NA,G
Ini "agak" bekerja tetapi saya akan berasumsi ada lebih banyak jenis tabel data cara melakukan ini. Saya mencoba
groups[, code_1_match_2 := list(group[code_1 == groups$code_1])]
Tetapi ini tidak berhasil.
Apakah saya kehilangan beberapa trik tabel data yang jelas untuk menghadapinya?
Hasil kasus ideal saya akan terlihat seperti ini (yang saat ini akan membutuhkan menggunakan metode saya untuk semua 3 kolom dan kemudian merangkai hasilnya):
group code_1 code_2 code_3 Immediate neighbors
A 2 NA 4 B,C,D,E
B 2 3 1 A,C,D,F
C 2 NA 1 A,B,F
D 7 3 4 B,A
E 8 NA 4 A,D
F NA NA 1 B,C
G 5 2 8
sumber
igraph
, itu bisa sangat menarik.Jawaban:
Menggunakan igraph , dapatkan tetangga tingkat 2, drop node numerik, rekatkan node yang tersisa.
Info lebih lanjut
Beginilah tampilan data kami sebelum mengonversi ke objek igraph. Kami ingin memastikan kode1 dengan nilai 2 berbeda dari kode2 dengan nilai 2, dll.
Begini tampilannya jaringan kami:
Perhatikan bahwa
A..G
node selalu terhubung melaluicode_x_y
. Jadi kita perlu mendapatkan gelar ke-2,ego(..., order = 2)
memberi kita tetangga untuk menyertakan tetangga tingkat ke-2, dan mengembalikan objek daftar.Untuk mendapatkan nama:
Untuk memastikan hasil, kita perlu menghapus
code_x_y
node dan node asal (1st node)sumber
Mungkin ada beberapa cara yang lebih praktis untuk mencapai ini, tetapi Anda bisa melakukan sesuatu seperti ini, menggunakan meleleh dan bergabung:
sumber
Ini terinspirasi oleh lelehan @ sindri_baldur. Solusi ini:
sumber
Seperti yang disebutkan oleh zx8754, menggunakan
data.table::melt
dengancombn
dan kemudianigraph::as_adjacency_matrix
keluaran:
atau tanpa menggunakan
igraph
keluaran:
sumber
xtabs
membuat output yang serupa sebagaiigraph
langkahnya?table
atauxtabs