【问题标题】:R: How can I apply column name changes to many data frames at once?R:如何一次将列名更改应用于多个数据框?
【发布时间】:2018-07-29 03:43:57
【问题描述】:

我正在尝试替换 100 多个数据帧的列标题中的某些单词。我有一个完美的字符串:

names(singledataframe) <- gsub(x = names(singledataframe), pattern = "Int'l", 
replacement = "International") 

我正在尝试将此应用于我制作的所有框架。我用 c() 在AllFrames 下引用它们。我试图制作一个在一个帧上工作的字符串的函数并将其应用于AllFrames,并带有一个for循环。

ChangeName1 <- function(singledataframe) {
  gsub(x = names(singledataframe), pattern = "Int'l", replacement = "International") 
  }

然后是这样的:

for (i in 1:length(names(AllFrames))) {lapply(i, ChangeName1)
}

我没有收到任何错误,但随机检查单个帧显示没有达到预期的效果。我尝试了很多变化,但我被卡住了!我在想也许我需要以更好的方式编辑引用 AllFrames 的 c() 。

  • 如果其中有任何不清楚或我通常发布不正确,我深表歉意。这是我的第一次,这一切对我来说都是新的。提前感谢您提供的任何指导或帮助。

【问题讨论】:

  • lapply(AllFrames,ChangeName1)
  • @Onyambu 感谢您的编辑。我对此有点陌生,即使是简单的事情,我也能在脑海中浮现。

标签: r dataframe rename multiple-columns


【解决方案1】:

您没有从您的函数中分配和返回更改后的data.frame。试试:

ChangeName1 <- function(singledataframe) {
    names(singledataframe) <- gsub(
        x = names(singledataframe), 
        pattern = "Int'l", 
        replacement = "International");
    return(singledataframe);
}

更新

假设您的data.frames 存储在list 中;我将使用一些随机生成的数据:

set.seed(2017);
lst <- list(
    data.frame(rnorm(10), rnorm(10)),
    data.frame(rnorm(10), rnorm(10)));
lst <- lapply(lst, function(x) { colnames(x) <- c("A", "Int'l"); x });
#[[1]]
#              A      Int'l
#1   1.434201478  0.3427681
#2  -0.077291959  1.5724254
#3   0.739137231 -0.7467347
#4  -1.758604727  0.3066498
#5  -0.069825227 -1.4304858
#6   0.451905527  1.1944265
#7  -1.958366456 -0.4820681
#8  -0.001524259  1.3178624
#9  -0.265336001 -1.1298316
#10  1.563222619 -0.9263514
#
#[[2]]
#             A      Int'l
#1   0.14070941 -0.6831744
#2  -0.85223255  0.2410894
#3   1.90339718  0.5894319
#4  -1.64818594 -0.9306249
#5   0.75962477  0.2974619
#6   0.06229087  3.1372771
#7  -0.38903119 -1.0275347
#8   0.63666563  1.9418028
#9  -0.86778544 -0.2779562
#10  0.09873361 -0.2215888

然后我们可以简单地将lapply 函数changeName1 传递给所有list 元素:

lapply(lst, ChangeName1);
#[[1]]
#              A International
#1   1.434201478     0.3427681
#2  -0.077291959     1.5724254
#3   0.739137231    -0.7467347
#4  -1.758604727     0.3066498
#5  -0.069825227    -1.4304858
#6   0.451905527     1.1944265
#7  -1.958366456    -0.4820681
#8  -0.001524259     1.3178624
#9  -0.265336001    -1.1298316
#10  1.563222619    -0.9263514
#
#[[2]]
#             A International
#1   0.14070941    -0.6831744
#2  -0.85223255     0.2410894
#3   1.90339718     0.5894319
#4  -1.64818594    -0.9306249
#5   0.75962477     0.2974619
#6   0.06229087     3.1372771
#7  -0.38903119    -1.0275347
#8   0.63666563     1.9418028
#9  -0.86778544    -0.2779562
#10  0.09873361    -0.2215888

【讨论】:

  • 谢谢!这行得通。快速跟进:调用单个框架仍然显示它不起作用。但是,names(AllFrames) 表明它确实在那里。我做错了什么,以便它将这些更改应用于 AllFrames 覆盖的所有框架?
  • @Kootseeahknee 我更新了我的解决方案,请看一下。为了最好地利用lapply,您应该将所有data.frames 放在list 中。然后只需将 lapply 函数添加到所有 list 元素。
  • 再次感谢您的帮助!不幸的是,它似乎不想采取。我试图应用您的更新,但我不得不修改它,因为我每个数据集有 300 多个列,并且我需要任何 Int'l 实例都是国际化的。感谢您的尝试,非常感谢!
  • @Kootseeahknee 你说的“它似乎不想拿”是什么意思?在我的解决方案中运行示例有效。您需要您的数据位于data.frames 中的list 中。你检查过这种情况吗?然后确保将lapply 的输出分配给一个对象,例如lst &lt;- lapply(lst, ChangeName1)。然后lst 将包含data.frames 的list,其中列名已根据ChangeName1 中定义的规则进行替换。
  • 我为我的措辞道歉。我遇到的任何问题肯定都在我的尽头。我确实确保AllFiles 是一个包含大约 178 个数据帧的列表。 I used ChangeName1 &lt;- function(singledataframe) { names(singledataframe) &lt;- gsub( x = names(singledataframe), pattern = "Int'l", replacement = "International"); } 在一个数据帧上。然后我做了你指定的:AllFrames &lt;- lapply(AllFrames, function(x) { colnames(x) &lt;- ("Int'l"); x })。我可能误解了您的字符串中的 A 内容,并删除了 c() 部分,因为我没有指定列名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
相关资源
最近更新 更多