是否有一种"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)
编辑:进一步澄清:
试试这个:
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.
卢卡斯,
感谢您的澄清:
您可以使用 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)