【问题标题】:Renaming columns in list of data frames using match from another data frame使用来自另一个数据框的匹配重命名数据框列表中的列
【发布时间】:2020-09-11 16:06:22
【问题描述】:

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

显然,我仍然无法围绕数据框列表或 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 表中的列名。将原来的列名替换为新的列名

【问题讨论】:

  • 您的预期输出是什么? dflist 有列名 ID Q1 Q11ID Q1a Q11 应该改成什么?
  • 啊,谢谢你的提问。真实数据很宽,有很多列。 CSV 具有原始列名和新列名。这张表是 Qs。在此示例中,df 中的原始问题 Q1a 需要为 Q1。
  • 所以我想做的是在所有数据帧中编写一个匹配函数,将新列名与旧列名匹配并更新所有数据帧
  • 我已编辑以更清楚地了解预期输出

标签: r dataframe rename lapply


【解决方案1】:

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

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

【讨论】:

  • 根据您的default.stringsAsFactors() 设置,您可能需要在创建Qs data.frame 时设置stringsAsFactors = FALSE 以使其工作
  • > df1 df2 > > dflist dflist > > > Qs > dflist > dflist [[1]] ID 1 Q1.1 1 1 2 3 [[2]] ID。 Q.1 Q1.1 1 2 3 4
  • 奇怪的是我得到 1 而不是 Q.1。我确定我抄对了!
  • 是的,这就是@starja 所说的。使用Qs &lt;- data.frame("Original.Name" = "Q.1a", "New.Name" = "Q.1", stringsAsFactors = FALSE)
  • 非常感谢,我试过了,但我应该清除环境并再次运行它。
猜你喜欢
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多