我试图通过对应表将数据帧的列重命名为两列数据帧(前面的名称和后面的名称(。
在我的情况下,要重命名的数据帧可能有我的对应表中没有引用的列(这不是问题,它们不会被重命名(,相反,对应表可能包含我的数据帧中没有包含的名称。此列表可用于其他数据帧。
而且,至少,两个数据帧中的名称顺序可能不相同,这太容易了。
我有一个有循环的解决方案,但试着找到另一个没有循环的解决方法。
知道吗?提前谢谢。
这是我的代码
df_to_rename <- data.frame(annee = 2010:2012,
code_commune = 67000:67002,
duree_occup_ou_vacance_tranche = 1:3,
nb_total_logements = 100:102,
secret_not_in_list = 1:3)
liste_noms_col <- data.frame(noms_origine = c("mode_occ",
"code_commune",
"annee",
"duree_occup_ou_vacance_tranche",
"nb_total_logements"),
noms_nouveaux = c("mode d'occupation - not included",
"code INSEE commune",
"Année",
"durée d'occupation (ou vacance)",
"Nombre de logements"))
##### Rename by loop
l_noms <- df_to_rename %>% names()
# (i_nom <- l_noms[1])
for(i_nom in l_noms) {
nom_a_changer <-
liste_noms_col[liste_noms_col$noms_origine == i_nom, "noms_nouveaux"]
# message(i_nom," -> ",nom_a_changer)
if(length(nom_a_changer)>0) {
df_to_rename <- df_to_rename %>%
rename({{nom_a_changer}} := {{i_nom}})
message(i_nom," -> ",nom_a_changer)
}
}
df_to_rename %>% names()
将liste_noms_col
变成一个包含deframe
、感兴趣的过滤器名称和rename()
:的列表
library(dplyr)
liste_noms_col <- deframe(liste_noms_col[, 2:1])
liste_noms_col <- liste_noms_col[liste_noms_col %in% names(df_to_rename)]
rename(df_to_rename, !!! liste_noms_col)
审计三重爆炸(!!!
(";未标记的拼接";替换:
expr(
rename(df_to_rename, !!! liste_noms_col)
)
#> rename(df_to_rename, `code INSEE commune` = "code_commune",
#> Année = "annee", `durée d'occupation (ou vacance)` = "duree_occup_ou_vacance_tranche",
#> `Nombre de logements` = "nb_total_logements")
使用match
并获取liste_noms_col
中存在的数据帧的新列名。对于liste_noms_col
中没有的列名,请保持原始列的原样。
cols <- liste_noms_col$noms_nouveaux[match(names(df_to_rename), liste_noms_col$noms_origine)]
cols[is.na(cols)] <- names(df_to_rename)[is.na(cols)]
names(df_to_rename) <- cols
df_to_rename
# Année code INSEE commune durée d'occupation (ou vacance) Nombre de logements secret_not_in_list
#1 2010 67000 1 100 1
#2 2011 67001 2 101 2
#3 2012 67002 3 102 3
使用dplyr
:
library(dplyr)
df_to_rename %>%
rename_with(~coalesce(liste_noms_col$noms_nouveaux[match(., liste_noms_col$noms_origine)], .))