假设我们有两个数据框,我们想合并它们。 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
的每个唯一df2
,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
有没有方便的方法来实现这个目标?
答案 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]))))