R 动态重命名列并忽略缺失

标签 r

我有一个数据集,我需要动态重命名特定列。

例如,我通常会按以下方式重命名“mtcars”数据集:

# THIS WORKS    
# Load data
data <- mtcars

# Gather data.frame with columns to rename, I am doing it this way because I generally have 
# a long list of "configurations" to plot that I go through in a for loop.  Might not be the most 
# efficient, but it generally works for me.
Columns_to_rename <- data.table(X = "mpg", Y = "gear", Color = "carb")

# Rename columns
plot_data <- data %>%
    dplyr::rename(X := !!Columns_to_rename$X[1],
                  Y := !!Columns_to_rename$Y[1],
                  Color := !!Columns_to_rename$Color[1]) %>%
    dplyr::select(X, Y, Color)

但是,在我具有真实 Columns_to_rename 的真实数据集中,我的数据集可能不包含标题。我只想忽略该重命名。

考虑上面例子中的情况:

Columns_to_rename <- data.table(X = "mpg", Y = "gear", Color = "missing")

据我所知,dplyr 包要求所有列都存在。坚持使用 tidyverse,我研究了使用 plyr 包,因为我知道这允许缺少列名。不幸的是,我不知道如何动态调用列。我查看了以前的 StackOverflow 问题和答案,但没有看到任何人需要在重命名时结合这两个原则。

谢谢!

最佳答案

一个选项是使用 %in% 进行子集化

library(dplyr)
nm1 <- unlist(Columns_to_rename)
nm2 <-  nm1[nm1 %in% names(data)]
data %>% 
      rename(!!! nm2) %>%
      select(names(nm2)) %>%
      head

-输出

#                    X Y
#Mazda RX4         21.0 4
#Mazda RX4 Wag     21.0 4
#Datsun 710        22.8 4
#Hornet 4 Drive    21.4 3
#Hornet Sportabout 18.7 3
#Valiant           18.1 3

或者另一种选择是子集向量 ('nm2') 上的 rename_atrename_with

data %>%
    rename_at(vars(all_of(nm2)), ~ names(nm2)) %>%
    select(names(nm2)) %>%
    head

注意:我们也可以用 any_of 包裹 'nm1',但问题是 names(nm1) 的长度不匹配

data %>% 
      rename_at(vars(any_of(nm1)), ~ names(nm2))

关于R 动态重命名列并忽略缺失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64900616/

相关文章:

r - 逻辑回归: 'odds ratio' is essentially just the ratio - what's the point?

r - 如何在 R 中的脚本中可视化数据集的使用

r - 将向量 X 设置为其他 2 个向量中向量 Y 最接近的值

r - 将 json/data 传递给 Shiny 的 javascript 对象

r - 列表的索引列表

r - 当 "skip"很大时,fred 占用大量内存

mysql - 选择字段与数千个字符串之一匹配的行

r - rbind data.frames 与不同列的有效方法

r - 在 Julia 中编写 R 包?

r - 自定义目标函数来优化 Fscore - XGBOOST