2015-02-25 6 views
7

Sto provando a passare un po 'di codice plyr a dplyr e rimanere bloccato con la nuova funzionalità di rename() in dplyr. Mi piacerebbe essere in grado di riutilizzare una singola espressione di rename() per un set di set di dati con nomi originali sovrapposti ma non identici. Ad esempio,Uso di dplyr's rename() compresi i nomi delle variabili non nel set di dati

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

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

E poi,

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

vorrei il risultato essere il fatto che la variabile A è rinominato var1 e B viene rinominato var2, non l'aggiunta di un var3 in questo caso. Invece, ho

errore: Unknown variabili: C.

Al contrario, la sintassi plyr mi permetteva di utilizzare

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

e non genera un errore. C'è un modo per ottenere lo stesso risultato in dplyr senza ottenere l'errore Variabili sconosciute?

+0

È possibile fare riferimento alla funzione di rinomina specificatamente da plyr: 'plyr :: rename (sample1, c (" A "=" var1 "," B "=" var2 "," C " = "var3")) ' –

risposta

4

completamente ignorando la richiesta effettiva su come fare questo con dplyr, vorrei suggerire un approccio diverso utilizzando una tabella di ricerca:

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) 

Fondamentalmente l'algoritmo è semplice:

  1. Creare una tabella di ricerca dei nomi delle variabili correnti nei nomi desiderati
  2. Utilizzando la funzione names(), eseguire una ricerca nella mappa con l'indice di mappatura es e assegnare quelle variabili mappate alle colonne appropriate.

MODIFICA: come da suggerimento di Hadley, ho usato un vettore con nome anziché una lista, la vita è molto più semplice. Mi dimentico sempre dei vettori denominati :(

+1

Puoi renderlo piuttosto semplice usando un vettore di caratteri con nome piuttosto che un elenco con nome – hadley

+1

modificato, grazie hadley! – earino

+0

Se vuoi solo nominare un sottoinsieme di colonne, questo imposterà tutte le altre colonne esistenti nomi a 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