合并数据文件
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_edges
与 rt_nodes
在 Target
上的初始连接以及中间结果与 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,因为示例数据没有包含足够多的匹配案例 类。但是,代码已经过验证可以使用 .
中提供的数据
我在 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_edges
与 rt_nodes
在 Target
上的初始连接以及中间结果与 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,因为示例数据没有包含足够多的匹配案例 类。但是,代码已经过验证可以使用