【问题标题】:R dplyr:: rename and select using string variableR dplyr:: 使用字符串变量重命名和选择
【发布时间】:2016-07-30 23:15:54
【问题描述】:

我正在尝试在我的数据框中选择一个变量子集,并重命名新数据框中的变量。我有大量需要重命名的变量。我正在使用

dplyr::select
dplyr::select_

由于我有许多要重命名的变量,我正在考虑是否应该使用字符串变量来重命名,但不确定是否可行?使用字符串可以帮助我管理新名称旧名称映射。这是一个例子

dplyr::select
library(dplyr)
library(nycflights13) 
set.seed(123)
data <- sample_n(flights, 3)

select(data,yr=year,mon=month,deptime=dep_time)

问题是如何在字符串中传递这个参数,即 newvariable=oldvariable 参数,然后使用

dplyr::select_

col_vector <- c("year", "month", "dep_time")
select_(data, .dots = col_vector)

我想到的字符串是:

rename_vector <- c("yr=year","mon=month","deptime=dep_time")

任何建议都会非常有帮助。

【问题讨论】:

  • 为什么不用colnames(data) &lt;- col_vector更改列名?
  • 真正的问题是如何在不手动构建的情况下自动生成col_vector?然后,您必须提供一些有关如何重命名这些列的逻辑。
  • @Gopala 在我的情况下,我不必更改所有列名,只需更改其中的一个子集。此外,通过“新名称 = 旧名称”不仅可以使其可读,还可以确保直接 1-1 匹配。想想 50 个变量名。
  • 您可以选择性地使用names(mtcars)[c(1, 2, 3)] &lt;- c('z', 'y', 'z') 或使用名称names(mtcars)[names(mtcars) %in% c('x', 'y', 'z')] &lt;- c('mpg', 'cyl', 'disp') 重命名列。
  • 如果您只想重命名一些变量但不是全部,这个答案可能很有用:stackoverflow.com/a/44143688/3871924

标签: r string dplyr rename


【解决方案1】:

您可以将列表传递给dplyr::select_ 中的.dots,而不是使用向量,其中名称是新列名称,旧名称是字符。

> rename_list <- list(sepal_length = "Sepal.Length", sepal_width = "Sepal.Width")
> iris %>% tbl_df %>% select_(.dots = rename_list)

Source: local data frame [150 x 2]

   sepal_length sepal_width
          (dbl)       (dbl)
1           5.1         3.5
2           4.9         3.0
3           4.7         3.2
4           4.6         3.1
5           5.0         3.6
6           5.4         3.9
7           4.6         3.4
8           5.0         3.4
9           4.4         2.9
10          4.9         3.1
..          ...         ...

【讨论】:

    【解决方案2】:

    dplyr

    另一个使用 dplyrsetNames 的选项来传递带有新列名的向量:

    iris %>%
      select(Sepal.Length, Sepal.Width) %>% 
      setNames(c("sepal_length","sepal_width")) 
    

    基础包

    setNames(iris[, c("Sepal.Length", "Sepal.Width")], 
             c("sepal_length", "sepal_width"))
    

    data.table

    library(data.table)
    setnames(iris, old = c("Sepal.Length", "Sepal.Width"), new = c("sepal_length","sepal_width"))
    

    【讨论】:

      【解决方案3】:

      使用rename_with,您可以执行以下操作:

      old = c("Sepal.Length", "Sepal.Width")
      new = c("sepal_length", "sepal_width")
      iris %>% 
        dplyr::select(all_of(old)) %>%
        dplyr::rename_with(~ new, all_of(old)) 
      

      【讨论】:

        猜你喜欢
        • 2015-08-03
        • 2018-07-04
        • 2021-05-19
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        • 2016-01-11
        • 2017-06-10
        • 2019-05-10
        相关资源
        最近更新 更多