我有一个这种结构的数据框:
A <- data.frame(A = c("B",NA,NA,NA),
B = c("C","D",NA,NA),
C = c(NA,NA,NA,NA),
D = c("A",NA,NA,NA))
其中 A、B、C 和 D 是我的网络的单位。我的问题是,我有一个链接 A -> B,但没有 B -> A,这只是没有记录在我拥有的数据中。例如,也是 B -> D,但不是 D -> B。我想操纵这个数据框(或者矩阵),以便每个链接都显示在每一列中。数据框应该如下所示:
B <- data.frame(A = c("B","D",NA,NA),
B = c("A","C","D",NA),
C = c("B",NA,NA,NA),
D = c("A","B",NA,NA))
在我的原始数据中,我有大约 68.000 个单位(列)和大约 30 个记录的(一侧)链接(行)。所以我的数据框现在非常大,我无法检查每个链接是否实际上被记录了两次(即 B 存在于 A 列中,但 A 不存在于 B 列中等等)。请记住,实际上有可能在某些情况下两个链接都已记录,我无法确定。
我希望我能清楚地表达我的问题。我很高兴有任何有用的想法。
提前致谢
这是基本 R 的一种解决方案:
B <- sapply(seq_along(A), function(i){
name <- names(which(colSums(A == names(A)[i], na.rm = TRUE) > 0))
A[[i]][head(which(is.na(A[i])), length(name))] <- name
sort(A[[i]], na.last = TRUE)
})
setNames(data.frame(B), names(A))
A B C D
1 B A B A
2 D C <NA> B
3 <NA> D <NA> <NA>
4 <NA> <NA> <NA> <NA>