1

2 つのデータ フレームがあり、それらをマージしたいとします。の各グループの値の数は、 の値の数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

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 に答える