2016-08-03 15 views
8

Heute morgen während der Analyse mit einem Datenrahmen habe ich einen Fehler aufgrund der Anwesenheit von doppelten Spaltennamen. Ich habe versucht, eine Lösung ausschließlich mit dplyr zu finden, aber ich konnte nichts finden, was funktioniert. Hier ist ein Beispiel zur Veranschaulichung des Problems. Ein Datenrahmen mit einem doppelten Spaltennamen.delete doppelte Spalte dplyr

x <- data.frame(matrix(c(1, 2, 3), 
       c(2,2,1),nrow=2,ncol=3)) 
colnames(x) <- c("a", "a", "b") 

Wenn ich versuche, die erste Spalte des Befehl select ich einen Fehler fallen

x %>% 
    select(-1)%>%filter(b>1) 

Error: found duplicated column name: a 

ich die Säule loswerden kann durch Wert traditionelle Indexierung und die Verwendung von dplyr zu filtern leicht mit

x<-x[,-1]%>%filter(b>1) 

, welche die gewünschte Ausgabe

> x 
    a b 
1 2 3 
2 2 3 
erzeugt

Irgendwelche Ideen, wie man das nur mit dplyr-Grammatik macht?

+2

Gut in der Basis R, die „richtige“ Weg ist wahrscheinlich 'x [! dupliziert (Namen (x), fromLast = TRUE)]. Finden Sie einfach einen Weg, das in dplyrs 'Select'-Verb zu werfen. Huh, selbst 'x%>% select (2,3)' funktioniert nicht, jammert über die LHS, bevor man sich die 'select'-Klausel ansieht. Ich würde das einen Fehler nennen. Grobe Problemumgehung: 'x%>% do (. [! Duplicated (name (.), FromLast = TRUE)]) – Frank

+0

Normalerweise benutze ich' make.names', um alles legal umzubenennen. – alistaire

+1

Wenn Sie herum graben denke ich, dass Sie die Wurzel des Bösen finden wird hier liegt in der Tatsache, dass plyr und dplyr Spaltennamen verwenden, um Daten auszuwählen. Dies erfordert, dass Spalten eindeutige Namen haben, es nicht nach Name und Inhalt auswählen. Das Basispaket verwendet Indizes, die ohne Berücksichtigung von Namenskonzepten funktionieren. Es ist eine Grenze des Pakets, die meiste Zeit lohnt sich die Grenze. – sconfluentus

Antwort

2

Dies könnte funktionieren, unter Ausnutzung der make.names Verhalten. Ich weiß nicht, ob ich hier betrogen habe, aber es scheint hauptsächlich dplyr-Funktionen zu nutzen.

x %>% 
    setNames(make.names(names(.), unique = TRUE)) %>% 
    select(-matches("*\\.[1-9]+$")) 
0

Wenn Sie wollte ich nur

x <- x[, c(2:3)] 

tun Oder man könnte es alternativ würde vollständig von der ersten Spalte, um loszuwerden, umbenennen

colnames(x)[1] <- "a.1" 
Verwandte Themen