首页 > 解决方案 > 使用来自另一个数据框的匹配重命名数据框列表中的列

问题描述

我意识到我在上一篇文章中提出了两个不同的问题,其中一个非常聪明的窥视者很快就回答了。

显然,我仍然无法围绕数据框列表或 lapply!

我有原始问题和重命名问题的 csv 列表。在此示例中,我尝试编写代码以根据 Qs 数据帧将 Q.1a 更新为 Q.1。

df1 <- data.frame("ID" = 1, "Q.1" = 2, Q1.1 = 3)
df2 <- data.frame("ID." = 2, "Q.1a" = 3, Q1.1 = 4)


dflist <- lapply(ls(), function(x) if (class(get(x)) == "data.frame") get(x))
dflist <- Filter(length, dflist)


Qs  <- data.frame("Original.Name" = "Q.1a", "New.Name" = "Q.1")

表格如下所示:我想根据 Qs 表更新 Q.1a

  ID Q.1a Q1.1
1  1    2    3

  ID. Q.1 Q1.1
1   2   3    4

  Original.Name New.name
1           Q.1a      Q.1

我试图编写的代码重命名当前充满错误的问题,我确信管道不应该在那里!

lapply(dflist, function(x) {
  names(x) <- names (x) %in%
  Qs$Original.name = Qs$New.name[match(names(x)[names(x) %in% Qs$Original.name],
         Qs$Original.name)]
})

谁能指出我正确的方向?非常感谢。

编辑以显示预期输出,其中上面原始示例中的 Q1a 已更新为 Q1。

  ID Q.1 Q1.1
1  1   2    3
  ID. Q.1 Q1.1
1   2   3    4

理想情况下,我希望能够匹配和替换 Qs 表中的列名。将原始列名替换为新列名

标签: rdataframerenamelapply

解决方案


您可以使用ifelsewithmatch来获取列的新名称。

dflist <- lapply(dflist, function(x) {
   names(x) <- ifelse(names(x) %in% Qs$Original.Name, 
                      Qs$New.Name[match(names(x), Qs$Original.Name)], names(x))
   x
})

dflist
#[[1]]
#  ID Q.1 Q1.1
#1  1   2    3

#[[2]]
#  ID. Q.1 Q1.1
#1   2   3    4

推荐阅读