合并数据文件

Merge data files

我在 R 中有以下数据框:

Id   Class
@a    64
@b    7
@c    98 

第二个数据框:

SOURCE    TARGET 
@d        @b
@c        @a 

这是描述社交网络中的节点和边。用户(前面都带@)属于特定社区,数量列在 class 列中。为了分析列之间的连接,我想合并这个数据框并创建一个新的数据框,如下所示:

SOURCE    TARGET    SOURCE.Class    TARGET.Class 
@a        @i        56               2
@f        @k        90               49 

当我尝试 merge() R 停止响应并且我需要终止 R。数据帧构成 20000(节点文件)和 30000(边缘文件)行。

然后我想知道给定源 class 中有多少记录具有相同的目标 class 以及 class 之间的连接百分比。

如果有人能帮助我,我会很高兴,因为我是 R 的新手。

编辑: 我想我设法使用 match() 而不是 merge() 通过此代码创建列(rt_node 包含列 "id"、"class" 和 rt_node包含列 "source"、"target"):

#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)]

现在我只需要弄清楚如何找到每个 class 中的连接百分比以及与其他 class 的连接百分比。关于如何做到这一点的任何提示?

问题 1:合并

这需要两个单独的连接操作:rt_edgesrt_nodesTarget 上的初始连接以及中间结果与 rt_nodes 在 [=] 上的后续连接17=]。此外,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)不涉及边并且
  • rt_nodes.
  • 缺少一个 id 的边 (@a -> @e)

双重加入

默认情况下,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 表示 rt_nodes.

中缺少 @e

问题 2

OP 包含了第二个问题(同时还创建了

Then I want to know how many records in a given source class have the same target class and percentage of connections between classes.

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,因为示例数据没有包含足够多的匹配案例 类。但是,代码已经过验证可以使用 .

中提供的数据