r - 使用来自另一个数据框的匹配重命名数据框列表中的列
问题描述
我意识到我在上一篇文章中提出了两个不同的问题,其中一个非常聪明的窥视者很快就回答了。
显然,我仍然无法围绕数据框列表或 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 表中的列名。将原始列名替换为新列名
解决方案
您可以使用ifelse
withmatch
来获取列的新名称。
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
推荐阅读
- latex - gnuplot中的LaTeX公式
- qt - 如何在 Quick3d 中使用图像控制节点的纹理大小?
- pandas - Pandas read_csv 大文件(50gb)问题
- android - 带有 Kotlin 片段的 Firebase
- bluetooth-lowenergy - 重新启动蓝牙时没有触发 didDetermineStateForRegion
- go - 为什么 AppEngine 找不到 Mailgun 包
- c# - ASP.NET Core Worker 服务中的依赖注入
- java - Android Studio choreographer.java
- php - if 语句存在问题并与特定类别匹配
- c# - 为什么我不能将类型 'T' 转换为 int where T : System.Enum?