r-通过对应关系列表重命名数据帧中的列



我试图通过对应表将数据帧的列重命名为两列数据帧(前面的名称和后面的名称(。

在我的情况下,要重命名的数据帧可能有我的对应表中没有引用的列(这不是问题,它们不会被重命名(,相反,对应表可能包含我的数据帧中没有包含的名称。此列表可用于其他数据帧。

而且,至少,两个数据帧中的名称顺序可能不相同,这太容易了。

我有一个有循环的解决方案,但试着找到另一个没有循环的解决方法。

知道吗?提前谢谢。

这是我的代码


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)], .))

最新更新