2014-10-20 14 views
23

Funkcje zmiany nazwy dplyr wymagają podania nowej nazwy kolumny jako niecytowane nazwy zmiennych. Mam jednak funkcję, w której nazwa kolumny jest skonstruowana przez wklejenie ciągu znaków na przekazywany argument, a więc jest ciągiem znaków.Wprowadź nowe nazwy kolumn jako ciąg w funkcji zmiany nazwy dplyr

Na przykład powiedzieć, że miał tę funkcję

myFunc <- function(df, col){ 
    new <- paste0(col, '_1') 
    out <- dplyr::rename(df, new = old) 
    return(out) 
} 

Jeśli uruchomić ten

df <- data.frame(a = 1:3, old = 4:6) 
myFunc(df, 'x') 

uzyskać

a new 
1 1 4 
2 2 5 
3 3 6 

Podczas gdy chcę 'nowych' kolumna będzie nazwa ciągu, który skonstruowałem ("x_1"), tj.

a x_1 
1 1 4 
2 2 5 
3 3 6 

Czy tak jest w ogóle?

+3

Z [komunikatu 'dplyr 0.3'] (http://blog.rstudio.org/2014/10/13/dplyr-0-3-2/):" Możesz teraz programować z 'dplyr' - każda funkcja korzystająca z niestandardowej oceny (NSE) ma również standardową wersję podwójną (SE), która kończy się na '_' [...] Wersja SE każdej funkcji ma podobne argumenty, ale muszą być jawnie" cytowane ". " Dlatego sprawdź, czy 'rename_' może być tu użyteczny. – Henrik

+0

Dzięki, warto wiedzieć, ale tak naprawdę nic nie zmienia w tym przypadku. Byłoby działało, gdyby kolumna, przez którą przechodziłem, była starą nazwą kolumny, ale zmiana powyższej funkcji na użycie rename_ (i wpisanie starych w cudzysłowy) nadal zwraca ten sam – user1165199

+2

@ user1165199 Zrobiłbym 'colnames (df) [colnames (df)% w% "old"] <- paste0 ("x", "_") '(w funkcji, jeśli jest to konieczne), ponieważ jest w stanie łatwo zamienić wektor nazw. – akrun

Odpowiedz

21

Myślę, że tego właśnie szukałeś. Jest wykorzystanie rename_ jak sugeruje @Henrik, ale argument ma, powiedzmy, ciekawe, nazwa:

> myFunc <- function(df, col){ 
+ new <- paste0(col, '_1') 
+ out <- dplyr::rename_(df, .dots=setNames(list(col), new)) 
+ return(out) 
+ } 
> myFunc(data.frame(x=c(1,2,3)), "x") 
    x_1 
1 1 
2 2 
3 3 
> 

Uwaga wykorzystanie setNames do używania wartość nowych jak nazwisko na liście.

+4

Nie jestem pewien, co 'list (col)' próbuje zrobić. Jeśli po prostu zrobisz '.dots = setNames (col, new)', twój przykład nadal działa. A jeśli masz wiele kolumn, których nazwy zmieniasz, 'list()' spowoduje problemy, ponieważ 'length (list (col))! = Length (new)' – gregmacfarlane