R中使用字符串变量重命名和选择列:dplyr::rename和select

11
我试图从我的数据框中选择一部分变量,并在新数据框中重新命名这些变量。我有许多需要重命名的变量。我正在使用:
```python df_subset = df[['var1', 'var2', 'var3']].rename(columns={'var1':'new_var1', 'var2':'new_var2', 'var3':'new_var3'}) ```
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)

如何将这些参数作为字符串传递,新变量=旧变量参数,然后使用?

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) <- col_vector 更改列名? - Gopala
真正的问题是如何在不手动构建的情况下自动生成“col_vector”?那么,您必须提供一些逻辑来说明您想要如何重命名这些列。 - Gopala
@Gopala 在我的情况下,我不必更改所有列名,只需要更改其中的一部分。此外,通过使用“新名称=旧名称”,不仅使其易读,而且还确保存在直接的1-1匹配。想象一下有50个变量名。 - rajvijay
您可以使用 names(mtcars)[c(1, 2, 3)] <- c('z', 'y', 'z') 或者使用名称 names(mtcars)[names(mtcars) %in% c('x', 'y', 'z')] <- c('mpg', 'cyl', 'disp') 来有选择地重命名列。 - Gopala
如果您只想重命名某些变量而不是所有变量,这个答案可能会有用:https://stackoverflow.com/a/44143688/3871924 - agenis
3个回答

15

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

:数据表是R语言中一个高效的工具包,用于处理大型数据集。
library(data.table)
setnames(iris, old = c("Sepal.Length", "Sepal.Width"), new = c("sepal_length","sepal_width"))

9

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
使用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)) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接