我想合并:
to_graph <- structure(list(Teacher = c("BS", "BS", "FA"
), Level = structure(c(2L, 1L, 1L), .Label = c("BE", "AE", "ME",
"EE"), class = "factor"), Count = c(2L, 25L, 28L)), .Names = c("Teacher",
"Level", "Count"), row.names = c(NA, 3L), class = "data.frame")
和
graph_avg <- structure(list(Teacher = structure(c(1L, 1L, 2L), .Label = c("BS",
"FA"), class = "factor"), Count.Fraction = c(0.0740740740740741,
0.925925925925926, 1)), .Names = c("Teacher", "Count.Fraction"
), row.names = c(NA, -3L), class = "data.frame")
merge(to_graph, graph_avg, by="Teacher")
,但不是得到我期望的(3行),我得到:
Teacher Level Count Count.Fraction
1 BS AE 2 0.07407407
2 BS AE 2 0.92592593
3 BS BE 25 0.07407407
4 BS BE 25 0.92592593
5 FA BE 28 1.00000000
有什么想法吗?谢谢!
答案 0 :(得分:6)
不确定您要完成的任务。 merge
正在做它应该做的事情。
让我们看看所有data.frames
graph_avg
Teacher Count.Fraction
1 BS 0.07407407
2 BS 0.92592593
3 FA 1.00000000
to_graph
Teacher Level Count
1 BS AE 2
2 BS BE 25
3 FA BE 28
merge(to_graph, graph_avg)
Teacher Level Count Count.Fraction
1 BS AE 2 0.07407407
2 BS AE 2 0.92592593
3 BS BE 25 0.07407407
4 BS BE 25 0.92592593
5 FA BE 28 1.00000000
现在,如果我要合并那些我必须要看,看看什么是常见的,我将得到什么结果。老师,你们两个都有。但是,如果我尝试合并教师,我该怎么办? BS没有唯一的标识符,它在两个data.frames中都出现两次。如果它出现在其中一个中,那将很容易解决。所以,我去检查并说,好吧,我在一个data.frame,level ...中有一个唯一的标识符,它会做到这一点......然后去做一些不会丢失任何数据的东西。 merge
对于你有一个小数据框架的情况非常方便,比如每个教师都有一次,并且它有教师的年龄或性别。您可以将其合并到您的另一个data.frame中,并对教师进行重复测量,每次教师出现时您都会知道这些。但是对于你正在做的事情,这不是正确的工具。
merge
不是你想要的。如果这些确实是您的data.frames,请使用cbind
。
cbind(to_graph, graph_avg$Count.Fraction)
Teacher Level Count Count.Fraction
1 BS AE 2 0.07407407
2 BS BE 25 0.92592593
3 FA BE 28 1.00000000
这可能就是你要找的东西。
答案 1 :(得分:2)
由于很明显你的一个数据集来自另一个,我建议你根本不需要合并,但是找到一种方法来进行分析,使所有数据保持不变
例如,使用包ddply
中的plyr
从另一个派生一个集合。请注意此结果如何包含您需要的所有信息:
> library(plyr)
> ddply(to_graph, .(Teacher), transform, Count.Fraction=Count/sum(Count))
Teacher Level Count Count.Fraction
1 BS AE 2 0.07407407
2 BS BE 25 0.92592593
3 FA BE 28 1.00000000
回答有关合并的问题。 R中的merge
类似于数据库join
。要连接两个表,您需要确保可以匹配两个表中的主键。您的主要关键是Teacher
和Level
的组合。由于您的第二个Level
中不存在data.frame
列,因此merge
是不可能的。
恢复这种情况的唯一方法是将主键的缺失位添加回数据。假设数据按完全相同的顺序排序,您可以使用cbind
执行此操作,然后执行merge
:
> merge(to_graph, cbind(graph_avg, Level=to_graph$Level))
Teacher Level Count Count.Fraction
1 BS AE 2 0.07407407
2 BS BE 25 0.92592593
3 FA BE 28 1.00000000