2016-02-26 173 views
4

由像dplyr和magrittr包啓用管道比喻是非常有用的,做偉大的事情,讓你的代碼可讀性在R(一個艱鉅的任務!)重命名多個變量

如何才能使一個流水線以數據框中的所有變量重命名爲預定列表結束?

這是我試過的。首先,簡單的樣本數據來測試:

> library(dplyr)  
> iris %>% head(n=3) %>% select(-Species) %>% t %>% as.data.frame -> test.data 
> test.data 

       1 2 3 
Sepal.Length 5.1 4.9 4.7 
Sepal.Width 3.5 3.0 3.2 
Petal.Length 1.4 1.4 1.3 
Petal.Width 0.2 0.2 0.2 

這不起作用:

> test.data %>% rename(a=1,b=2,c=3) 
Error: Arguments to rename must be unquoted variable names. Arguments a, b, c are not. 

我是不是能夠從閱讀rename文檔找出這個錯誤的確切含義。我的另一個嘗試通過使用大括號定義代碼塊避免了錯誤,但是改名並沒有真正發生:

> test.data %>% { names(.) <- c('a','b','c')} 
+0

我喜歡當人們回答自己這樣的問題。謝謝!(對我來說不是一個相關的問題,但我仍然喜歡) – Daniel

+4

請在你的問題中提供一個可重現的例子。如果你自己沒有回答這個問題,這可能會因爲幾個原因而被關閉 – rawr

+1

我建議遵循rawr的建議:在你的問題中舉一個例子。另外,拿出元評論。如果您想聊聊自我回答,可以在自己的帖子下面添加評論。這篇文章應該是關於這個問題,而不是關於你回答的事實,或者答案並不像我想象的那麼容易。 – Frank

回答

2

我得到這個工作的方式,我需要從magrittr包發球操作:

> library(magrittr) 
> test.data %T>% { names(.) <- c('a','b','c')} -> renamed.test.data 
> renamed.test.data 
       a b c 
Sepal.Length 5.1 4.9 4.7 
Sepal.Width 3.5 3.0 3.2 
Petal.Length 1.4 1.4 1.3 
Petal.Width 0.2 0.2 0.2 

注意,對於正常的(即不是數字)數據幀的變量名,你可以這樣做:

> # Rename it with rename in a normal pipe 
> renamed.test.data %>% rename(x=a,y=b,z=c) -> renamed.again.test.data 
> renamed.again.test.data 
       x y z 
Sepal.Length 5.1 4.9 4.7 
Sepal.Width 3.5 3.0 3.2 
Petal.Length 1.4 1.4 1.3 
Petal.Width 0.2 0.2 0.2 

上述招(編輯:或者,甚至更好,使用setNames)是仍然有用,不過,因爲有時你已經有了一個字符向量中的名字列表,你只需要一次設置它們,而不用擔心寫出每個替換對。

+3

爲什麼不是'iris%>%head(n = 3)%>%select(-Species)%>%t%>%as.data.frame%>%setNames(c('a','b',' c'))' – rawr

+0

無管道:'setNames(as.data.frame(t(iris [1:3,-5])),letters [1:3])' – zx8754

+0

管道不是必須的,但它們對於可讀性來說是非常好的,因爲它們允許讀取操作從左到右,如dplyr文檔中所述:https://cran.r-project.org/web/packages/dplyr/dplyr.pdf –

3

'1', '2','3'You,不同之處(我在以前的評論回答zx8754)使用setNames {}統計數據,而不是重命名

setNames正確的:這是一個方便的功能在 對象上設置名稱並返回該對象。它在 函數定義的末尾非常有用,其中一個創建要返回的對象 ,並且不希望將其存儲在某個名稱下,因此名稱可以是 已分配。

你的榜樣(關閉只需更改與setNames重命名)

iris %>% 
    head(n=3) %>% 
    select(-Species) %>% 
    t %>% 
    as.data.frame %>% 
    rename(a=1,b=2,c=3) 

回答

iris %>% 
    head(n=3) %>% 
    select(-Species) %>% 
    t %>% 
    as.data.frame %>% 
    setNames(c('1','2','3')) 

另一個例子

name_list <- c('1','2','3') 

iris %>% 
    head(n=3) %>% 
    select(-Species) %>% 
    t %>% 
    as.data.frame %>% 
    setNames(name_list) 
1

我們可以重命名數值variab通過在Backquote(`)中附上dplyr::rename

library(dplyr) 

iris %>% 
    head(n=3) %>% select(-Species) %>% t %>% as.data.frame %>% 
    dplyr::rename(a=`1`, b=`2`, c=`3`) 
# a b c 
# Sepal.Length 5.1 4.9 4.7 
# Sepal.Width 3.5 3.0 3.2 
# Petal.Length 1.4 1.4 1.3 
# Petal.Width 0.2 0.2 0.2 

的另一種方式,我們可以通過stats::setNamesmagrittr::set_namespurrr::set_names集列名。

library(dplyr) 
library(magrittr) 
library(purrr) 

iris %>% 
    head(n=3) %>% select(-Species) %>% t %>% as.data.frame %>% 
    stats::setNames(c("a", "b", "c")) 

iris %>% 
    head(n=3) %>% select(-Species) %>% t %>% as.data.frame %>% 
    magrittr::set_names(c("a", "b", "c")) 

iris %>% 
    head(n=3) %>% select(-Species) %>% t %>% as.data.frame %>% 
    purrr::set_names(c("a", "b", "c")) 
# The results of above all codes is as follows: 
# a b c 
# Sepal.Length 5.1 4.9 4.7 
# Sepal.Width 3.5 3.0 3.2 
# Petal.Length 1.4 1.4 1.3 
# Petal.Width 0.2 0.2 0.2