5

次のデータフレームがあるとします。

DF1 <- data.frame("A" = rep(c("A","B"), 18),
                  "B" = rep(c("C","D","E"), 12),
                  "NUM"= rep(rnorm(36,10,1)),
                  "TEST" = rep(NA,36))

DF2 <- data.frame("A" = rep("A",6),
                  "B" = rep(c("C","D"),6),
                  "VAL" = rep(c(1,3),3))

*注意: 変数ABinの一意の各組み合わせにDF2は、一意の が必要VALです。

行ごとに、列と一致する値と列とその行の値が一致する場合、 in を inNATEST対応する値に置き換えたいと思います。そうでなければ、そのままにしておきます。マッチを使用して各組み合わせをループせずにこれを行うにはどうすればよいですか?VALDF1AABBTESTNA

理想的には、回答は、一致する多くの列を持つ 2 つのデータ フレームにスケーリングされます。

4

2 に答える 2

6

Akrun がコメントで述べたように、ルックアップ テーブル (DF2) は、一意の A/B の組み合わせだけに縮小する必要があります。現在のデータフレームでは、これは問題ではありませんが、同じ組み合わせに対して複数の可能な値がある場合は、追加のルールが必要になります。そこから、解決策は簡単です。

DF2.u <- unique(DF2)
DF3 <- merge(DF1, DF2.u, all = T)

これにより、空の TEST 列 (すべての値NA) と DF2 から割り当てられた VAL 列を持つ新しいデータフレームが生成されることに注意してください。やりたいことを正確に実行する (可能な場合は TEST を VAL に置き換える) ために、少しぎこちないコードを次に示します。

DF1$TEST <- merge(DF1, DF2.u, all = T)$VAL

編集:あなたの質問に応えて、必要に応じて非常に簡単にDF2を煮詰めることができます:

DF2$C <- c(1:12) #now unique() won't work
DF2.u <- unique(DF2[1:3])

 A B VAL
1 A C   1
2 A D   3
于 2015-03-23T14:53:19.213 に答える