2015-02-25 8 views
7

Ich versuche, einigen plyr-Code in dplyr zu überführen, und bleibe mit der neuen Funktionalität von rename() in dplyr stecken. Ich möchte in der Lage sein, einen einzelnen rename() -Ausdruck für einen Satz von Datensätzen mit überlappenden, aber nicht identischen ursprünglichen Namen wiederzuverwenden. Zum BeispielVerwenden von dplyrs rename() einschließlich Variablennamen, die nicht im Datensatz enthalten sind

sample1 <- data.frame(A=1:10, B=letters[1:10]) 

sample2 <- data.frame(B=11:20, C=letters[11:20]) 

Und dann

rename(sample1, var1 = A, var2 = B, var3 = C) 

würde ich mit dem Ergebnis zufrieden, dass die Variable A sein wird var1 umbenannt und B wird var2 umbenannt, keine var3 in diesem Fall hinzufügen. Stattdessen bekomme ich

Fehler: Unbekannte Variablen: C.

Im Gegensatz dazu würde die plyr Syntax mir

rename(sample1, c("A" = "var1", "B" = "var2", "C" = "var3")) 
rename(sample2, c("A" = "var1", "B" = "var2", "C" = "var3")) 

verwenden lassen und nicht einen Fehler aus. Gibt es eine Möglichkeit, dasselbe Ergebnis in dplyr zu erhalten, ohne den Fehler Unbekannte Variablen zu erhalten?

+0

Sie könnten die Umbenennungsfunktion speziell von plyr referenzieren: 'plyr :: rename (sample1, c (" A "=" var1 "," B "=" var2 "," C " = "var3")) ' –

Antwort

4

Völlig Ihre tatsächliche Anfrage ignorieren, wie dies mit dplyr zu tun, würde Ich mag einen anderen Ansatz vorschlagen, eine Lookup-Tabelle:

sample1 <- data.frame(A=1:10, B=letters[1:10]) 
sample2 <- data.frame(B=11:20, C=letters[11:20]) 

rename_map <- c("A"="var1", 
       "B"="var2", 
       "C"="var3") 

names(sample1) <- rename_map[names(sample1)] 
str(sample1) 

names(sample2) <- rename_map[names(sample2)] 
str(sample2) 

Grund der Algorithmus ist einfach:

  1. Erstellen Sie eine Nachschlagetabelle der aktuellen Variablennamen zu den gewünschten Namen
  2. Verwenden Sie die Funktion names(), suchen Sie in der Karte mit dem Mapping-Index es und weisen diese zugeordneten Variablen den entsprechenden Spalten zu.

EDIT: Wie pro Hadley Vorschlag, habe ich einen benannten Vektor anstelle einer Liste, macht das Leben viel einfacher. Ich vergesse immer benannte Vektoren :(

+1

Sie könnten dies einfacher machen, indem Sie einen benannten Zeichenvektor anstelle einer benannten Liste verwenden – hadley

+1

bearbeitet, danke hadley! – earino

+0

Wenn Sie nur eine Teilmenge von Spalten benennen möchten, wird dies alle anderen vorhandenen Spalten setzen Namen für NA. –

1
#no need to use rename 

    oldnames<-unique(c(names(sample1),names(sample2))) 
    newnames<-c("var1","var2","var3") 
    name_df<-data.frame(oldnames,newnames) 
    mydata<-list(sample1,sample2) # combined two datasets as a list 
#one liner 
    finaldata <- lapply(mydata, function(i) {colnames(i)<-name_df[name_df[,1] %in% colnames(i),2] 
return(i)}) 
> finaldata 
[[1]] 
    var1 var2 
1  1 a 
2  2 b 
3  3 c 
4  4 d 
5  5 e 
6  6 f 
7  7 g 
8  8 h 
9  9 i 
10 10 j 

[[2]] 
    var2 var3 
1 11 k 
2 12 l 
3 13 m 
4 14 n 
5 15 o 
6 16 p 
7 17 q 
8 18 r 
9 19 s 
10 20 t 
Verwandte Themen