web-dev-qa-db-ja.com

データフレームの値を別のデータフレームの値と一致させ、前者を他のデータフレームの対応するパターンに置き換えます

タイトルは複雑ですが、ここで私が達成しようとしていることの簡単な例を示します。

_d <- data.frame(v1 = c(1,2,3,4,5,6,7,8), 
                v2 = c("A","E","C","B","B","C","A","E"))

m <- data.frame(v3 = c("D","E","A","C","D","B"), 
                v4 = c("d","e","a","c","d","b"))
_

_d$v2_の値は、_m$v4_の_d$v2_の値と一致させることにより、_m$v3_の値に置き換える必要があります

結果のデータフレームdは次のようになります。

_v1    v4
1      a
2      e
3      c
4      b
5      b
6      c
7      a
8      e
_

私は別のものを試しました、そして私が来た最も近いものは:d$v2 <- m$v4[which(m$v3 %in% d$v2)]

もう一度forループを避けようとします!可能でなければなりません:-)どういうわけか...;)

17
user969113

あなたは試すことができます:

merge(d,m, by.x="v2", by.y="v3")
  v2 v1 v4
1  A  1  a
2  A  7  a
3  B  4  b
4  B  5  b
5  C  3  c
6  C  6  c
7  E  2  e
8  E  8  e

編集する

順序を維持するための別のアプローチを次に示します。

data.frame(v1=d$v1, v4=m[match(d$v2, m$v3), 2])
  v1 v4
1  1  a
2  2  e
3  3  c
4  4  b
5  5  b
6  6  c
7  7  a
8  8  e
18
johannes

標準の左結合を使用できます。

データの読み込み:

d <- data.frame(v1 = c(1,2,3,4,5,6,7,8), v2 = c("A","E","C","B","B","C","A","E"), stringsAsFactors=F)
m <- data.frame(v3 = c("D","E","A","C","D","B"), v4 = c("d","e","a","c","d","b"), stringsAsFactors=F)

列「v2」で結合できるように列名を変更する

colnames(m) <- c("v2", "v4")

Data.frame dの順序を結合して維持する

library(dplyr)
left_join(d, m)

出力:

  v1 v2 v4
1  1  A  a
2  2  E  e
3  3  C  c
4  4  B  b
5  5  B  b
6  6  C  c
7  7  A  a
8  8  E  e
10
Esben Eickhardt

これにより、必要な出力が得られます。

_d$v2 <- m$v4[match(d$v2, m$v3)]
_

match関数は、m_matrixのv3列から、一致する_d$v2_の値の位置を返します。 (match()を使用して)インデックスを取得したら、それらのインデックスを使用して_m$v4_から要素にアクセスし、dマトリックスの列v2の要素を置き換えます。

4
Swati Gupta