2016-08-10 8 views
0

2つのデータフレームがあります。私は、データフレームNAMEに列名のリストを持っています。私は、列名が次の列のデータフレームNAMEに対応する別のデータフレームDFを持っています。これらの名前をDFの列名に置き換える必要があります。Rがデータフレームで列名を照合して置き換えます

DF: 
     A B C D E 
H001 947 95 10 10 678 
H002 647 40 10 10 806 
H003 840 20 99 53 21 
H004 105 10 97 12 44 
H005 595 59 76 76 67 

NAME: 
Name Real.name 
A Pete 
B May 
C Jon 
D Paul 
E Emma 
F Fuchs 
G George 

Desired output: 
     Pete May Jon Paul Emma 
H001 947 95  10 10 678 
H002 647 40  10 10 806 
H003 840 20  99 53 21 
H004 105 10  97 12 44 
H005 595 59  76 76 67 
+0

試し 'sapply(COLNAMES(DF)、機能(x)はgrepl(X、名前$ Real.nameが))' – OdeToMyFiddle

+2

はあなた@Osssan?match' –

+0

'を見てとっている使用します正規表現は非常に壊れやすいです。 '?paste'でアンカーを試してください –

答えて

2

このような場合はどうですか?

編集:@PierreLafortuneにより示唆されるように、より良い代替:

names(df) <- name$Real.name[match(names(df), name$Name)] 

独創的なアプローチ:

names(df)<-merge(data.frame(Name=names(df)),name,all.x=T)[,"Real.name"] 

df 
    Pete May Jon Paul Emma 
H001 947 95 10 10 678 
H002 647 40 10 10 806 
H003 840 20 99 53 21 
H004 105 10 97 12 44 
H005 595 59 76 76 67 

データ:

df <- structure(list(A = c(947L, 647L, 840L, 105L, 595L), B = c(95L, 
40L, 20L, 10L, 59L), C = c(10L, 10L, 99L, 97L, 76L), D = c(10L, 
10L, 53L, 12L, 76L), E = c(678L, 806L, 21L, 44L, 67L)), .Names = c("A", 
"B", "C", "D", "E"), class = "data.frame", row.names = c("H001", 
"H002", "H003", "H004", "H005")) 

name <- structure(list(Name = structure(1:7, .Label = c("A", "B", "C", 
"D", "E", "F", "G"), class = "factor"), Real.name = structure(c(7L, 
5L, 4L, 6L, 1L, 2L, 3L), .Label = c("Emma", "Fuchs", "George", 
"Jon", "May", "Paul", "Pete"), class = "factor")), .Names = c("Name", 
"Real.name"), class = "data.frame", row.names = c(NA, -7L)) 
+0

新しいデータフレームを構築するために速度を落とす必要はありません。 'NAME'はマッピングを行います。 –

+0

@PierreLafortune申し訳ありません、私は次のことではありません - あなたは 'data.frame'を作成せずに引き続きマージを使用することを提案していますか? '名前(df)'は単なるベクトルではありませんか? –

+0

マージを避けて、名前が既に新しい値 'names(DF) 'にマッピングされているという事実を利用することができます。 - NAME $ Real.name [マッチ(names(DF)、NAME $ Name)]' –

1

おそらくあります多くのソリューション。私はplyr::mapvalues

names(DF) <- plyr::mapvalues(names(DF), from = NAME$Name, to = NAME$Real.name) 
関連する問題