根据向量new_varname,old_varname重命名dplyr中的变量名[重复]

Posted

技术标签:

【中文标题】根据向量new_varname,old_varname重命名dplyr中的变量名[重复]【英文标题】:Rename variable names in dplyr based on vectors new_varname, old_varname [duplicate] 【发布时间】:2016-10-02 12:54:21 【问题描述】:

是否有一种“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

编辑: 进一步澄清:

假设要翻译的变量向量很长,那么手工编写新旧名称对是不可行的 要重命名的变量是总变量的子集,我还是想保留所有变量

【问题讨论】:

我认为对于这种情况,使用 base-R 解决方案会更好。有什么不适合你的? @Shorpy:问题是我为繁重的数据操作加载了 data.table。 Data.table 改变了子集 "[ ]" 的 sintax 并破坏了一些代码。所以我试图在 dplyr 中包含与元数据相关的代码。 可能被骗? Rename multiple columns by names 【参考方案1】:

卢卡斯,

感谢您的澄清:

您可以使用 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)

输出:

> 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

【讨论】:

对不起,我的帖子不清楚(我现在会编辑)。假设要翻译的变量向量很长,因此手动编写旧 - 新名称对(如您的答案)是不可行的。谢了。 @LucasMation - 在更新的问题上下文中,我的偏好是 data.table::setnames()。查看更新的示例。【参考方案2】:

使用setNames()

    > df <- letters[1:5]
    > iris %>% setNames(df)

如果您知道要在原始数据中重命名的列的索引,则可以使用 setnames()from data.table 包来实现

   > df <- letters[24:26]
   > df
   [1] "x" "y" "z"
   > setnames(iris,names(iris)[c(1,2,5)],df)
   > head(iris)
       x   y Petal.Length Petal.Width      z
   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

【讨论】:

Tks。这似乎是正确的方向。但是,翻译字典中包含的变量只是总变量的一个子集,我想保留它们(见我上面的编辑) 您说的是假设您有 5 列,并且您想重命名其中的任何 3 列,其余两个名称将是原始名称。对吗? 是的!但是你不能假设变量的顺序在数据集和字典中是相同的【参考方案3】:

试试这个:

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

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

【讨论】:

这看起来不错,但我收到一个错误:# Error: All arguments to rename must be named. @LucasMation 嗯,我不确定出了什么问题。但是我更新了答案以显示我这边的完整过程 rename_ 现在已弃用。如果您想使用 tidyverse(在这种情况下为 dplyr 和 purrr),Jeff Hammerbacher 对 rename() 和 !!set_names() 的回答在此时确实有效【参考方案4】:

解决此问题的另一种方法是取消引用命名向量,其中新列名作为名称,旧列名作为值。请注意,我使用purrr::set_names 来制作命名向量。

library(tidyverse)
d <- as_tibble(iris)
vt <- tibble(old_varname=c('Sepal.Length','Petal.Length'),
             new_varname=c('a','b'))
d_new_names <- d %>% rename(!!set_names(vt$old_varname, vt$new_varname))
head(d_new_names)

【讨论】:

以上是关于根据向量new_varname,old_varname重命名dplyr中的变量名[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Armadillo C++:根据其他两个向量对向量进行排序

根据另一个不同大小和类型的向量对点向量进行排序

如何根据不同的向量创建重复字符串的向量

是否可以根据另一个向量的整数值组合(添加)一个向量的值

根据包含的类型检索向量的向量

如何比较 2 个向量并根据比较创建单独的向量