2017-08-24 3 views
1

謝罪これは重複した質問であると私は感謝していますが、これを理解するのに役立つ良い例を提供します。最初にデモデータフレーム:Rの2列マッピングデータフレームを使用してメインデータフレームの値を変更する

> map_df = data.frame(name = c('nick', 'mike', 'joe', 'tom'), id = c(1, 2, 3, 4), stringsAsFactors = FALSE) 
> main_df = data.frame(P1 = c('nick', 'mike', 'nick', 'mike', 'nick', 'mike', 'joe', 'tom'), 
        P2 = c('joe', 'tom', 'joe', 'tom', 'joe', 'tom', 'nick', 'mike'), 
        stringsAsFactors = FALSE) 

> map_df 
    name id 
1 nick 1 
2 mike 2 
3 joe 3 
4 tom 4 

> main_df 
    P1 P2 
1 nick joe 
2 mike tom 
3 nick joe 
4 mike tom 
5 nick joe 
6 mike tom 
7 joe nick 
8 tom mike 

上記のデータを使用すると、私の質問/出力は簡単です。 main_dfのすべての値を関連IDに置き換えたい。

> output_df 
    P1 P2 
1 1 3 
2 2 4 
3 1 3 
4 2 4 
5 1 3 
6 2 4 
7 3 1 
8 4 2 

ありがとうございました!私は次の出力データフレームを希望しています。

答えて

3

matchを使用できます。 「名前」「map_df」の欄と「map_df」に対応する「ID」に値を変更する数値指標を用いてlapplymatchの列をループは、「main_df」

main_df[] <- lapply(main_df, function(x) map_df$id[match(x, map_df$name)]) 
に出力を割り当てます

それとも別の方法は、ルックアップテーブルとしてお使いmap_dfを使用することですmatrixに変換し、それを

main_df[] <- setNames(map_df$id, map_df$name)[as.matrix(main_df)] 
+1

ありがとうございましたこれは完璧ですが、マッチ機能の使用はここに適しています – Canovice

1

に一致します。

rownames(map_df) = map_df$name 
main_df$P1 = map_df[main_df$P1, "id"] 
main_df$P2 = map_df[main_df$P2, "id"] 
関連する問題