2016-08-10 3 views
0

Ich habe zwei Datenrahmen. Ich habe eine Liste von Spaltennamen in einem Datenrahmen NAME. Ich habe dann einen anderen Datenrahmen DF, wobei der Spaltenname dem Datenrahmen NAME in der nächsten Spalte entspricht. Ich muss diese Namen zu den Spaltennamen in DF ersetzen.R stimmen überein und ersetzen Spaltennamen durch Datenrahmen

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

try 'sapply (COLNAMES (DF), Funktion (x) Grepl (x, Name $ Real.name))' – OdeToMyFiddle

+2

Haben Sie einen Blick auf '? Match' –

+0

genommen @Osssan Ihre Regex ist sehr zerbrechlich. Versuchen Sie, mit '? Paste' zu ​​verankern –

Antwort

2

Wie wäre es mit so etwas?

bearbeiten: Eine bessere Alternative als von @PierreLafortune vorgeschlagen:

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

Der ursprüngliche Ansatz:

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 

Daten:

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

Keine Notwendigkeit zu verlangsamen, um einen neuen Datenrahmen zu erstellen, wenn 'NAME' hat die Zuordnung an Ort und Stelle. –

+0

@PierreLafortune Sorry, ich folge nicht - schlagen Sie vor, ein 'dat.frame' zu ​​erstellen und trotzdem eine Zusammenführung zu verwenden? Sind 'Namen (df)' nicht einfach ein Vektor? –

+0

Sie können die Zusammenführung vermeiden und die Tatsache nutzen, dass die Namen bereits den neuen Werten zugeordnet sind 'name (DF) <- NAME $ Real.name [Übereinstimmung (Namen (DF), NAME $ Name)] –

1

Es gibt wahrscheinlich viele Lösungen. Ich würde plyr::mapvalues

names(DF) <- plyr::mapvalues(names(DF), from = NAME$Name, to = NAME$Real.name) 
Verwandte Themen