我在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包含列“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)]
现在我只需要弄清楚如何找到每个类中的连接百分比以及与其他类的连接百分比。关于如何做到这一点的任何提示?
答案 0 :(得分:1)
这需要两个单独的联接操作:在rt_edges
上rt_nodes
与Target
的初始联接以及rt_nodes
上Source
与rt_edges
的后续联接}。此外,data.table
的所有行都应出现在结果中。
以下方法使用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在其编辑的Q代码中使用的变量和列的命名,但请注意,这与OP给出的样本数据不一致。)
@f
请注意,OP提供的示例数据中添加了其他行以演示
的效果@a -> @e
)和rt_nodes
),其中data.table
缺少一个ID。默认情况下,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
中缺少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
。
OP包含了第二个问题(同时也创建了a new post)
然后我想知道给定源类中有多少记录具有相同的目标类和类之间的连接百分比。
04-09 09:03:23.509 2722-2722/com.pz.mediatonmessanger E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pz.mediatonmessanger, PID: 2722
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.pz.mediatonmessanger/com.pz.mediatonmessanger.ChatDialogActivity}: java.lang.InstantiationException: class com.pz.mediatonmessanger.ChatDialogActivity has no zero argument constructor
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.InstantiationException: class com.pz.mediatonmessanger.ChatDialogActivity has no zero argument constructor
at java.lang.Class.newInstance(Class.java:1563)
at android.app.Instrumentation.newActivity(Instrumentation.java:1065)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.NoSuchMethodException: <init> []
at java.lang.Class.getConstructor(Class.java:531)
at java.lang.Class.getDeclaredConstructor(Class.java:510)
at java.lang.Class.newInstance(Class.java:1561)
at android.app.Instrumentation.newActivity(Instrumentation.java:1065)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
计数为1,此处的份额为0,因为样本数据不包含足够的匹配类的情况。但是,代码已经过验证,可以使用the other post of the OP中提供的数据。