我有一个数据集,它有不同的源节点和目标节点,还有一个与关系相关的数值变量。
它看起来有点像这样:
library(igraph)
library(tidygraph)
set.seed(24601)
example_data <-
data.frame(source =
sample(letters[1:10],
100,
replace = TRUE),
target =
sample(letters[16:25],
100,
replace = TRUE),
important_variable =
rnorm(100))
字符串
假设source的成员是个人,target的成员是他们去过的不同城市,我想创建一个网络,显示同一个人何时访问了两个给定的城市。我会使用bipartite_projection(),如下所示:
example_data %>%
graph_from_data_frame() %>%
as_tbl_graph() %>%
mutate(type =
ifelse(name %in% letters[1:10],
TRUE,
FALSE)) %>%
bipartite_projection(which = "true")
型
然而,我只想在满足一定条件的情况下连接不同的城市:例如,当important_variable的值之间的差异最大为0.5时(例如,当同一个人在同一年访问过两个城市时,我感兴趣)。目前,使用bipartite_projection后,来自important_variable的信息被丢弃。
我看不出有什么方法可以限制基于第三个数字变量的bipartite_projection。有可能吗?提前感谢您的帮助。
使用edit更新以显示所需的输出:
让我们看一小部分的行:
example_data %>%
filter(source == "a") %>%
head()
这将产生以下结果:
source target important_variable
1 a x 0.29773720
2 a p 1.50474490
3 a y 0.01149263
4 a q 0.19391773
5 a t -0.10656946
6 a w -0.29516668
我可以直接进入二分投影,像这样:
example_data %>%
filter(source == "a") %>%
head() %>%
graph_from_data_frame() %>%
as_tbl_graph() %>%
mutate(type =
ifelse(name %in% letters[1:10],
TRUE,
FALSE)) %>%
bipartite_projection(which = "false")
其产生具有一个顶点属性name
和一个边属性node
的iGraph对象。
然而,我想要看起来像这样的东西(为了简单起见,只有前四行):
source_projected target_projected source_att target_att
1 x p 0.2977372 1.50474490
2 x y 0.2977372 0.01149263
3 x q 0.2977372 0.19391773
4 x t 0.2977372 -0.10656946
因为这将允许我根据source_att
和target_att
列之间的关系进行过滤(例如,过滤source_att
和target_att
之间的差异小于0.5)
第二次更新,更详细的期望输出
@ JumasIsCoding提供了一个符合我要求的解决方案。这让我意识到我没有足够详细。
再次从原始数据开始,我们可以看到a
链接到p
两次,a
链接到y
两次。在每种情况下,important_variable
的值都是不同的。如下所示:
example_data %>%
filter(source == "a" &
(target == "p" |
target == "y"))
source target important_variable
1 a p 1.50474490
2 a y 0.01149263
3 a y -2.34069094
4 a p 0.29294049
我发布的示例所需数据仅包括target
中的每个节点连接一次。然而,由于important_variable
的值不同,我希望输出包括这些配对的所有配置,如下所示:
source_projected target_projected source_att target_att
1 p y 0.2977372 0.01149263
2 p y 0.2977372 -2.34069094
3 p y 0.2929405 0.01149263
4 p y 0.2929405 -2.34069094
这是一个可以构建的东西吗?谢谢!
1条答案
按热度按时间3pmvbmvn1#
更新
由于单个目标可能有多个值,我想最好使用
left_join
并为relationship
参数启用"many-to-many"
字符串
你会看到
型
上一页
也许你可以试试下面的代码
这给
然后我猜你知道如何过滤行,并限制
source_att
和target_att
之间的差异。