2017-06-09 32 views
4

雖然這很容易做到與基R或setnamesin data.tablerename_dplyr 0.5。由於rename_已棄用,因此我找不到在dplyr 0.6.0中執行此操作的簡單方法。重命名多個列給出字符向量的列名和替換

下面是一個例子。我想在col.from相應值col.to替換列名:

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 

預期輸出:

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 

我怎麼能做到這一點,在dplyr 0.6.0 renamerename_at

回答

8

我不知道這是否是接近正確的方式,但

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 

另外請注意,我生活在未來:

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

或略短'DF%>% rename_at(vars(col.from),〜col.to)' –

+0

哇,兩者在語法上都很簡單。唯一的情況是,在這種情況下,很難讓我看到'rename_at'的行爲。我認爲'.funs'會應用於'.vars'中的每個colname。我沒有想到它會按位置匹配。 – mt1022

+1

@ mt1022是的,@docendodiscimus中的一個將成爲'?select_all'文檔中的一個很好的例子。該功能適用​​於所有選定的列名稱。這意味着,'function(x)'基本上接收'x'中的'col.from'值,然後它可以做它的東西 - 這在我們的例子中只是返回一個長度爲3的不同的字符向量。 – lukeA