2017-06-09 1 views
4

Dies ist mit Base R oder setnamesin data.table oder rename_ in dplyr 0.5 einfach. Da rename_ veraltet ist, konnte ich keinen einfachen Weg finden, dies in dplyr 0.6.0 zu tun.Benennen Sie mehrere Spalten mit Zeichenvektoren für Spaltennamen und Ersetzen um.

Unten ist ein Beispiel. Ich möchte Spaltennamen in col.from mit entsprechenden Werten in col.to ersetzen:

col.from <- c("wt", "hp", "vs") 
col.to <- c("foo", "bar", "baz") 

df <- mtcars 
head(df, 2) 
#>    mpg cyl disp hp drat wt qsec vs am gear carb 
#> Mazda RX4  21 6 160 110 3.9 2.620 16.46 0 1 4 4 
#> Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4 

Erwartete Ausgabe:

names(df)[match(col.from, names(df))] <- col.to 
head(df, 2) 
#>    mpg cyl disp bar drat foo qsec baz am gear carb 
#> Mazda RX4  21 6 160 110 3.9 2.620 16.46 0 1 4 4 
#> Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4 

Wie kann ich das mit rename oder rename_at in dplyr 0.6.0?

Antwort

8

Ich weiß nicht, ob dies der richtige Weg ist, sich ihm zu nähern, aber

library(dplyr) 
df %>% rename_at(vars(col.from), function(x) col.to) %>% head(2) 
#    mpg cyl disp bar drat foo qsec baz am gear carb 
# Mazda RX4  21 6 160 110 3.9 2.620 16.46 0 1 4 4 
# Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4 

Beachten Sie auch, dass ich in Zukunft leben:

# packageVersion("dplyr") 
# # [1] ‘0.7.0’ 
+5

Oder etwas kürzer 'df%>% rename_at (vars (col.from), ~ col.to) ' –

+0

Wow, beide sind sehr einfach in der Syntax. Die einzige Sache ist, dass es für mich schwierig ist, das Verhalten von "rename_at" in einem solchen Fall aufzuheben. Ich dachte, die '.funs' würden auf jeden Spaltennamen in' .vars' angewendet. Ich habe nicht erwartet, dass es nach Position passt. – mt1022

+1

@ mt1022 Ja, der von @docendodiscimus würde ein gutes Beispiel im '? Select_all' Dokument machen. Die Funktion wird auf alle ausgewählten Spaltennamen angewendet. Das heißt, 'function (x)' erhält grundsätzlich die 'col.from' Werte in' x', dann kann es damit umgehen - was in unserem Fall nur einen anderen Zeichenvektor der Länge 3 zurückgibt. – lukeA

Verwandte Themen