1

假设我们有两个数据框,我们想要合并它们。中每个组的值的数量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

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

我的目标是获得:

## 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

有没有方便的方法来实现这一点?

4

2 回答 2

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
于 2013-10-10T15:51:46.397 回答
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]))))
于 2013-10-10T16:37:36.757 回答