我在 R 中有以下数据框:
Id Class
@a 64
@b 7
@c 98
第二个数据框:
SOURCE TARGET
@d @b
@c @a
这描述了社交网络中的节点和边。用户(前面都是@)属于一个特定的社区,数量列在列类中。为了分析列之间的连接,我想合并这些数据框并创建一个如下所示的新数据框:
SOURCE TARGET SOURCE.Class TARGET.Class
@a @i 56 2
@f @k 90 49
当我尝试merge()
R 时停止响应,我需要终止 R。数据帧构成 20000(节点文件)和 30000(边缘文件)行。
然后我想知道给定源类中有多少记录具有相同的目标类和类之间的连接百分比。
如果有人能帮助我,我会很高兴,因为我对 R 很陌生。
编辑:我想我设法通过此代码使用match()
而不是merge()
(rt_node 包含列“id”、“class”和 rt_node 包含列“源”、“目标”)来创建列:
#match source in rt_edges with id in rt_node
match(rt_edges$Source,rt_nodes$id)
#match target in rt_edges with id in rt_node
match(rt_edges$Target,rt_nodes$id)
#create source_class
rt_nodes$modularity_class[match(rt_edges$Source,rt_nodes$id)]
rt_edges$Source_Class=rt_nodes$modularity_class[match(rt_edges$Source,rt_nodes$id)]
#create target_class
rt_nodes$modularity_class[match(rt_edges$Target,rt_nodes$id)]
rt_edges$Target_Class=rt_nodes$modularity_class[match(rt_edges$Target,rt_nodes$id)]
现在我只需要弄清楚如何找到每个类中的连接百分比以及与其他类的连接百分比。关于如何做到这一点的任何提示?
这需要两个单独的连接操作:rt_edges
与rt_nodes
on的初始连接Target
和中间结果与rt_nodes
on的后续连接Source
。此外,所有行rt_edges
都应出现在结果中。
下面的方法使用data.table
. (我采用了 OP 在其 Q 的编辑代码中使用的变量和列的命名,但请注意,这与 OP 提供的示例数据不一致。)
library(data.table)
rt_nodes <- fread(
"id Class
@a 64
@b 7
@c 98
@d 23
@f 59")
rt_edges <-fread(
"Source Target
@d @b
@c @a
@a @e")
请注意,已在 OP 提供的示例数据中添加了额外的行以演示
@f
不包含在边中的节点 ( ) 和@a -> @e
缺少一个 id的边 ( ) rt_nodes
。默认情况下,联接data.table
是右联接。因此,rt_edges
出现在右侧。
result <- rt_nodes[rt_nodes[rt_edges, on = c(id = "Target")], on = c(id = "Source")]
# rename columns
setnames(result, c("Source", "Source.Class", "Target", "Target.Class"))
result
# Source Source.Class Target Target.Class
#1: @d 23 @b 7
#2: @c 98 @a 64
#3: @a 64 @e NA
所有三个边都出现在结果中。该NA
指示@e
是从丢失rt_nodes
。
OP 包含了第二个问题(同时还创建了一个新帖子)
然后我想知道给定源类中有多少记录具有相同的目标类和类之间的连接百分比。
result[, .(.N, share_of_occurrence_in_Target.Class = sum(Source.Class == Target.Class)/.N),
by = Source.Class]
# Source.Class N share_of_occurrence_in_Target.Classs
#1: 23 1 0
#2: 98 1 0
#3: 64 1 NA
这里的计数为 1,份额为 0,因为样本数据不包含足够的匹配类案例。但是,该代码已经过验证,可以与OP 的另一篇文章中提供的数据一起使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句