我有一个数据集,我需要动态重命名特定列。
例如,我通常会按以下方式重命名“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_at
或 rename_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/