【问题标题】:Rename multiple variables within a pipeline重命名管道中的多个变量
【发布时间】:2016-06-09 22:49:03
【问题描述】:

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

【问题讨论】:

  • 我喜欢人们这样回答自己的问题。谢谢! (对我来说不是一个相关的问题,但我仍然喜欢它)
  • 请在您的问题中提供一个可重现的示例。如果你自己没有回答这个问题,这可能会因为几个原因而关闭
  • 我建议遵循 rawr 的建议:在你的问题中举一个例子。另外,取出元评论。如果您想聊聊自我回答,您可以在自己的帖子下方添加评论。帖子应该是关于问题的,而不是关于你回答的事实,或者答案并不像我想象的那么容易。
  • 最初的尝试使用数字周围的反引号rename(a='1', b='2', c='3')
  • @rawr,我不确定您的投诉是什么。该问题包含使用基本安装中的数据的可重现示例。缺什么?你在说什么“聊天”?

标签: r rename dplyr magrittr


【解决方案1】:

按照我的工作方式,我需要 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)仍然有用,因为有时您已经在字符向量中拥有名称列表,而您只想一次设置它们而不用担心编写取出每个替换对。

【讨论】:

  • 为什么不iris %&gt;% head(n=3) %&gt;% select(-Species) %&gt;% t %&gt;% as.data.frame %&gt;% setNames(c('a','b','c'))
  • 无管道:setNames(as.data.frame(t(iris[1:3, -5])), letters[1:3])
  • 管道不是绝对必要的,但它们非常具有可读性,因为它们允许从左到右进行读取操作,如 dplyr 文档中所述:cran.r-project.org/web/packages/dplyr/dplyr.pdf
  • 感谢所有告诉我有关 setNames 的人,这绝对可以解决问题!不知道为什么这在我的谷歌搜索中没有出现,但现在这一切都在一个方便后代的地方。
【解决方案2】:

'1','2','3'你是对的,除了使用 setNames {stats} 而不是 rename(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)

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 2014-06-26
      • 2013-04-17
      • 2019-04-20
      • 1970-01-01
      • 2021-09-21
      • 2018-03-20
      相关资源
      最近更新 更多