r - 基于矩阵元素为igraph中的节点添加属性
问题描述
我创建了一个网络,并且有兴趣让节点拥有基于我的初始属性的属性dataframe
。例如,我dataframe
将每个节点显示为一定数量的关键字,但这是我在创建网络的过程中丢失的信息。在这个阶段,我有兴趣将其归因于每个节点,以便在稍后阶段进行进一步分析。
图表示例:
g <- graph.formula(4506-8974, 8974-6345, 7842-4653, 4653-6345, 7842-8974)
V(g)$name <- c("4506", "8974", "6345", "7842", "4653")
额外的困难是 mydataframe
采用 a 的形式matrix
(尽管在技术上仍然是 a dataframe
)。行是节点,列是关键字。我希望列(即关键字)成为每个节点的属性:V(g)$keyword
. 如果 element = 1,则显示为属性,如果 element = 0,则不考虑。有谁知道该怎么做?我应该使用ifelse
函数吗?此外,我认为重要的是不要混淆节点 ID 的顺序,否则可能会将关键字属性赋予错误的节点。
df <- data.frame("agriculture" = c(0,1,0,0,0), "arts" = c(0,0,0,1,0), "banks" = c(1,0,1,0,0),
"cities" = c(0,0,0,1,0), "companies" = c(0,0,0,0,1))
rownames(df) <- c("4506", "8974", "6345", "7842", "4653")
NodeID agriculture arts banks cities companies
4506 0 0 1 0 0
8974 1 0 0 0 0
6345 0 0 1 0 0
7842 0 1 0 1 0
4653 0 0 0 0 1
V(g)$keyword <- keyword based on if the element = 1 for each node
我希望的结果是例如:
V(g)$keyword[1]
[1] "banks"
V(g)$keyword[4]
[4] "arts" "cities"
解决方案
以下代码几乎可以满足您的需求。不同的是,它V(g)$keyword
变成了"list"
. 因此,其成员的提取将与您发布的示例略有不同。
V(g)$keyword <- apply(df, 1, function(x) names(df)[x == 1])
V(g)$keyword[1]
#[[1]]
#[1] "banks
V(g)$keyword[[1]]
#[1] "banks"
V(g)$keyword[4]
#[[1]]
#[1] "arts" "cities"
V(g)$keyword[[4]]
#[1] "arts" "cities"
推荐阅读
- sqlite - 将 spatialite 构建到 Qt QSqlDatabase 驱动程序中
- android - SQLite 主键设置错误 - 为什么会这样?
- windows - 使用 EnableDelayedExpansion 在命令行脚本中显示感叹号 (!)
- ios - 如何在 macOS Mojave 10.14.6 上运行 Xcode 11.4
- javascript - Javascript - 脚本在第二次点击时不起作用
- c - 指针混淆:c 中的交换方法
- html - 如何调整 div 元素以使网站在不同屏幕尺寸的设备上看起来相同?
- python - 取行中没有标签的数值,正则表达式
- python - InvalidArgumentError- 已明确分配给 /device:GPU:1 但可用设备为 [ /job:localhost/replica:0/task:0/device:CPU:0,
- python - 如何在 Flask SQLAlchemy 中的模型中存储列表