2014-04-03 8 views
38
df <- structure(list(`a a` = 1:3, `a b` = 2:4), .Names = c("a a", "a b" 
), row.names = c(NA, -3L), class = "data.frame") 

i dane wyglądadplyr: wybierz nazwy kolumn zawierające spacje

a a a b 
1 1 2 
2 2 3 
3 3 4 

Po wywołaniu wybrać

select(df, 'a a') 

daje

Error in abs(ind[ind < 0]) : 
    non-numeric argument to mathematical function 

Jak mogę wybrać " aa "i/lub zmień jego nazwę na coś bez u śpiewać select? Znam następujące podejścia:

  1. names(df)[1] <- "a"
  2. select(df, a=1)
  3. select(df, ends_with("a"))

ale jeśli pracuję na dużym zbiorze danych, w jaki sposób mogę uzyskać dokładne dopasowanie nie znając numer indeksu lub podobne nazwy kolumn?

Odpowiedz

42

Możesz select zmienną za pomocą backticks `.

select(df, `a a`) 
# a a 
# 1 1 
# 2 2 
# 3 3 

Jednakże, jeśli głównym celem jest, aby zmienić nazwę kolumny, można użyć rename w plyr opakowaniu, w którym można korzystać zarówno "" i ``.

rename(df, replace = c("a a" = "a")) 
rename(df, replace = c(`a a` = "a")) 

Albo w base R:

names(df)[names(df) == "a a"] <- "a" 

Dla dokładniejszego opisu na wykorzystaniu różnych cytatów, patrz ?Quotes. Szczególnie istotne jest tutaj sekcja "Nazwy i identyfikatory":

inne nazwy składniowe nieważne mogą być używane, o ile są cytowane. Korzystny cytat jest lewy apostrof”.

Zobacz także ?make.names o prawidłowych nazw.

Zobacz także this post o zmianie nazwy w dplyr

+2

można również zrobić to samo z 'select':' select (DF, a = \ 'a do \') ' – Arun

+0

@Arun, Dzięki za sugestię. Ale czy to nie zmienia nazwy "a", "i" wybierz tylko tę zmienną (w przeciwieństwie do "zmiany nazwy")? – Henrik

+0

Henrik, masz rację. Ale 'rename' skopiuje cały plik data.frame tylko po to, aby zmienić nazwy kolumn. Tak więc, nie użyłbym go/uważam za skuteczny. Nie jestem pewien, czy istnieje sposób jak 'setattr' w' data.table'. Np .: 'setattr (df, 'names', c (" a "," b "))) zmienia nazwę tutaj przez odniesienie. – Arun

0

Niektóre alternatywy dla backticks, dobry dzień dplyr 0.5.0 The bieżąca wersja na tym piśmie:

Jeśli próbujesz programowo wybrać argument jako kolumnę i nie chcesz zmieniać nazwy lub coś takiego, jak paste/sprintf nazwa kolumny w backticks, można użyć as.name w połączeniu z wersją non-standard evaluation z select, który jest select_:

dplyr::select_(df, as.name("a a")) 

Wiele funkcji dplyr mają niestandardowe wersje. W przypadku select można również użyć wersji standardowej w połączeniu z pomocnikiem wyboru one_of.Zobacz ?dplyr::select_helpers dokumentacji:

dplyr::select(df, dplyr::one_of("a a")) 
+0

To jest nieprawidłowe. Nawet wersja NSE dplyr nie radzi sobie z tym. Na przykład: 'colnames (mtcars) [1] <-" Miles Per Gallon "' 'mtcars%>% select _ (" Miles Per Gallon ")' Spowoduje to błąd. – krthkskmr

+1

'mtcars%>% select_ (as.name (" Miles Per Gallon "))' działa. – Andy

Powiązane problemy