【发布时间】:2017-12-28 15:03:21
【问题描述】:
我试图在这里和谷歌上找到答案,但没有运气,几天来一直在努力解决这个问题,所以非常感谢帮助。我正在分析一个网络,看看周期是否倾向于在谨慎的社区内或在它们之间,或者没有模式。我的数据是一个循环列表(三个节点形成一个循环)和一个社区列表(节点数量可变)。我有两个问题,1)如何比较两个列表,2)如何以可读的方式输出比较结果:
- 问题 1
我有两个列表(两个 igraph 对象),一个包含 678 个项目(每个 3 个元素,所有字符),另一个包含 11 个项目,每个项目具有不同数量的元素。示例:
x1 <- as.character(c(1,3,5))
x2 <- as.character(c(2,4,6))
x3 <- as.character(c(7,8,9))
x4 <- as.character(c(10,11,12))
x <- list(x1, x2, x3, x4)
y1 <- as.character(c(1,2,3,4,5))
y2 <- as.character(c(2,3,4,5))
y3 <- as.character(c(1,2,3,4,5,7,8,9))
y <- list(y1, y2, y3)
给予:
> x
[[1]]
[1] "1" "3" "5"
[[2]]
[1] "2" "4" "6"
[[3]]
[1] "7" "8" "9"
[[4]]
[1] "10" "11" "12"
> y
[[1]]
[1] "1" "2" "3" "4" "5"
[[2]]
[1] "2" "3" "4" "5"
[[3]]
[1] "1" "2" "3" "4" "5" "7" "8" "9"
我想将x 中的每个组件与y 中的每个组件进行比较,并将每个命中(即当x[[i]] 中的所有元素也在y[[i]] 中找到时)添加到一个新的数据帧。我尝试使用all() 和%in% 循环,但这不起作用:
for (i in 1:length(x)) {
for (j in 1:length(y)) {
hits <- all(y[[j]] %in% x[[i]]) == TRUE
print(hits)
}
}
这将返回 12 个FALSE 命中。检查单个组件,它应该可以工作,因为:
all(x[[1]] %in% y[[1]])
按原样返回TRUE,并且:
all(x[[1]] %in% y[[2]])
按应有的方式返回 FALSE。我哪里错了?
- 问题 2
我已经看到了一些将循环结果输出到 df 的解决方案,但这并不是我所需要的。我想要的输出是一个数据框,告诉我每个周期都在哪个社区。由于只有 11 个社区,它可以让我参考列表组件的索引,但我还没有找到方法来做到这一点。我也可以只使用paste() 将社区的节点名称连接成标题。无论哪种方式,这是我需要的输出:
cycle community
1 1_3_5 1_2_3_4_5
2 1_3_5 1_2_3_4_5_7_8_9
3 7_8_9 1_2_3_4_5_7_8_9
我猜是某种 if 语句。我觉得这应该很容易执行,而且我应该能够自己解决。不过,感谢您抽出宝贵时间,并对这篇文章感到抱歉。
【问题讨论】:
标签: r list loops for-loop igraph