重命名管道中的多个变量

时间:2016-02-26 16:09:47

标签: r rename dplyr magrittr

由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')}

3 个答案:

答案 0 :(得分:3)

'1','2','3'你是正确的,除了使用setNames {stats}而不是重命名(zx8754在你的评论中回答)

  

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 :(得分:2)

我使用它的方式,我需要magrittr包中的tee操作符:

> 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)仍然很有用,因为有时你已经在角色向量中有了名字列表而你只想一次性设置它们而不用担心写作每个替换对。

答案 2 :(得分:1)

我们可以通过用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