我有一个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
我要实现的目标是,每个小组都根据可用的代码找到直接的邻居。例如:由于代码_1,组A具有直接邻居组B,C(所有组中的code_1等于2),由于代码3,组A具有直接邻居组D,E(在所有这些组中,代码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完成。
—
zx8754
我的目的是将结果输入igraph来创建一个邻接矩阵。如果我缺少一些可以做到这一点的功能,请指出来,那真的很有帮助!
—
User2321
@ zx8754请考虑发布涉及的解决方案
—
tmfmnk
igraph
,这可能真的很有趣。
@tmfmnk发布,尽管认为可能会有更好的igraph方式。
—
zx8754