根据向量new_varname,old_varname在dplyr中重命名变量名

Luc*_*ion 4 r rename dplyr

是否有一种"dplyr方式"来基于变量名称转换器(vt)重命名data.frame中的变量子集,data.frame包含具有旧变量名和新变量名的列(分别为old_varname和new_varname).例如:

d <- iris
vt <- data.frame(old_varname=c('Sepal.Length','Petal.Length'),
                  new_varname=c('a','b'))
d <- d %>% rename_( .... )
#In base R code, this would be:
names(d)[names(d) %in% vt$old_varname] <- vt$std_varname
Run Code Online (Sandbox Code Playgroud)

编辑:进一步澄清:

  • 假设要翻译的变量的向量非常长,因此手动编写新旧名称对是不可行的
  • 要重命名的变量是总变量的子集,我仍然希望保留所有变量

zyu*_*idi 6

试试这个:

d <- iris
vt <- data.frame(old_varname=c('Sepal.Length','Petal.Length'),
              new_varname=c('a','b'), stringsAsFactors = F)
d.out <- d %>% rename_(.dots = setNames(vt$old_varname, vt$new_varname))

head(d.out)
    a Sepal.Width   b Petal.Width Species
1 5.1         3.5 1.4         0.2  setosa
2 4.9         3.0 1.4         0.2  setosa
3 4.7         3.2 1.3         0.2  setosa
4 4.6         3.1 1.5         0.2  setosa
5 5.0         3.6 1.4         0.2  setosa
6 5.4         3.9 1.7         0.4  setosa
Run Code Online (Sandbox Code Playgroud)

请注意第一个参数setNames不能接受factor,所以我vt通过添加修改stringsAsFactors = F.


Tec*_*e01 2

卢卡斯,

感谢您的澄清:

您可以使用 data.table::setnames()。希望这可以帮助。

if (!require(data.table)) install.packages(data.table)
data(iris)
d <- iris
head(d)
old_varname=c('Sepal.Length','Petal.Length')
new_varname=c('a','b')
d2 <- d %>% data.table::setnames(old = old_varname, new = new_varname)
head(d2)
Run Code Online (Sandbox Code Playgroud)

输出:

> if (!require(data.table)) install.packages(data.table)
> data(iris)
> d <- iris
> head(d)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> old_varname=c('Sepal.Length','Petal.Length')
> new_varname=c('a','b')
> d2 <- d %>% data.table::setnames(old = old_varname, new = new_varname)
> head(d2)
    a Sepal.Width   b Petal.Width Species
1 5.1         3.5 1.4         0.2  setosa
2 4.9         3.0 1.4         0.2  setosa
3 4.7         3.2 1.3         0.2  setosa
4 4.6         3.1 1.5         0.2  setosa
5 5.0         3.6 1.4         0.2  setosa
6 5.4         3.9 1.7         0.4  setosa
Run Code Online (Sandbox Code Playgroud)