У меня есть data.table :
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
Я хотел бы добиться, чтобы каждая группа нашла ближайших соседей на основе доступных кодов. Например: Группа A имеет группы непосредственных соседей B, C из-за code_1 (code_1 равен 2 во всех группах) и имеет группы непосредственных соседей D, E из-за code_3 (code_3 равен 4 во всех этих группах).
То, что я пробовал, для каждого кода, поднабор первого столбца (группы) на основе совпадений следующим образом:
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
Это "своего рода" работает, но я хотел бы предположить, что есть способ таблиц данных, способ сделать это. Я старался
groups[, code_1_match_2 := list(group[code_1 == groups$code_1])]
Но это не работает.
Я упускаю какой-то очевидный трюк с таблицей данных, чтобы справиться с этим?
Мой идеальный результат будет выглядеть следующим образом (что в настоящее время потребует использования моего метода для всех 3 столбцов и последующего объединения результатов):
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
источник
igraph
, которое может быть очень интересным.Ответы:
Используя igraph , получите соседей 2-й степени, отбросьте числовые узлы, вставьте оставшиеся узлы.
Больше информации
Так выглядят наши данные перед преобразованием в объект igraph. Мы хотим убедиться, что code1 со значением 2 отличается от code2 со значением 2 и т. Д.
Вот как выглядит наша сеть:
Обратите внимание, что
A..G
узлы всегда связаны черезcode_x_y
. Таким образом, нам нужно получить 2-ую степень,ego(..., order = 2)
дать нам соседей, включая соседей 2-й степени, и вернуть объект списка.Чтобы получить имена:
Чтобы предварительно подтвердить результат, нам нужно удалить
code_x_y
узлы и исходный узел (1-й узел)источник
Вероятно, есть более практичный способ достижения этого, но вы можете сделать что-то вроде этого, используя расплавления и объединения:
источник
Это вдохновлено расплавлением @ sindri_baldur. Это решение:
источник
Как упомянуто zx8754, используя
data.table::melt
сcombn
и затемigraph::as_adjacency_matrix
вывод:
или без использования
igraph
вывод:
источник
xtabs
создать аналогичный выход какigraph
шаг?table
илиxtabs