如何通过在R中重复使用而不重复地合并两个不同长度的数据帧?

时间:2013-10-10 15:19:35

标签: r merge dataframe

假设我们有两个数据框,我们想合并它们。 df2中每个组的值的数量小于或等于df1中的值的数量:

df1 <- data.frame(group = c(rep("A", 5), rep("B", 4), rep("C", 2)),
                  values = c(51, 13, 18, 89, 3, 27, 86, 85, 31, 100, 55))
df2 <- data.frame(group = c(rep("A", 2), rep("B", 2), rep("C", 2)),
                  values = c(30, 36, 50, 60, 45, 70))
df.merge <- merge(df1, df2, "group")

我们得到这样的东西:

head(df1)
## group values
## A     51
## A     13
## A     18
## A     89
## A      3
## B     27

df2
## group values
## A     30
## A     36
## B     50
## B     60
## C     45
## C     70

head(df.merge)
## group values.x values.y
## A       51       30
## A       51       36
## A       13       30
## A       13       36
## A       18       30
## A       18       36

因此,对于value的每个唯一df2df1中相应组的每一行都是重复的。

我的目标是获得:

## group values.x values.y
## A       51       30
## A       13       36
## A       18       30
## A       89       36
## A        3       30
## B       27       50
## B       86       60
## B       85       50
## B       31       60
## C       100      45
## C       55       70

有没有方便的方法来实现这个目标?

2 个答案:

答案 0 :(得分:3)

这样做:

library(data.table)
dt1 = data.table(df1)
dt2 = data.table(df2)

setkey(dt2, group)

dt1[, values.y := dt2[J(.BY[[1]])]$values, by = group]
dt1
#    group values values.y
# 1:     A     51       30
# 2:     A     13       36
# 3:     A     18       30
# 4:     A     89       36
# 5:     A      3       30
# 6:     B     27       50
# 7:     B     86       60
# 8:     B     85       50
# 9:     B     31       60
#10:     C    100       45
#11:     C     55       70

答案 1 :(得分:1)

使用基础R的解决方案。本质上,我们的想法是重复df2中每个组的值,使其等于df1中每个组中的行数。这可以使用rep和参数length.out来完成。可以在by中为每个组单独完成,然后我unlist添加到df1

的向量
df1$values.y = unlist(by(df2, df2$group, 
                    function(x) rep(x$values, length.out = length(df1$group[df1$group == x$group]))))