4

我正在尝试合并:

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

有任何想法吗?谢谢!

4

2 回答 2

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.frame 中出现两次。如果它在其中一个中出现一次,那将很容易解决。所以,我可以检查并说,好的,我在一个 data.frame 中有一个唯一标识符,级别......可以做到......然后去做一些不会丢失任何数据的东西。 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

这可能就是你要找的。

于 2011-11-24T22:40:25.783 回答
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 中的Amerge类似于数据库join。要连接两个表,您需要确定您可以匹配两个表中的主键。在您的情况下,主键是Teacher和的组合Level。由于Level您的 second 中不存在该列data.frame,因此 amerge是不可能的。

恢复这种情况的唯一方法是将主键的缺失位添加回数据中。假设数据以完全相同的顺序排序,您可以执行此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
于 2011-11-25T14:54:00.750 回答