【问题标题】:Changing Column names of multiple data frames using a for loop with data frames loaded into a List使用 for 循环更改多个数据帧的列名,并将数据帧加载到列表中
【发布时间】:2023-03-03 10:32:01
【问题描述】:

我正在尝试在 for 循环中更改所有数据帧中的变量名称。数据的任何示例是:

df1 <- data.frame(
  Number = c(45,62,27,34,37,55,40),
  Day = c("Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun"))
df2 <- data.frame(
  Number = c(15,20,32,21,17,18,13),
  Day = c("Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun"))
df3 <- data.frame(
  Number = c(12,32,22,14,16,21,30),
  Day = c("Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun")

L <- list(df1,df2,df3)

我目前的尝试是:

for(i in L){
colnames(L) <- c("NewName1", "NewName2")
}

哪个不起作用,我不明白为什么它不起作用。请让我知道是否有人可以指导我正确的方向。

【问题讨论】:

  • 如果你的for循环是for (i in L),那么你需要在循环内使用i。在这种情况下,您最好使用整数索引来循环:for(i in seq_along(L)){colnames(L[[i]]) = c("NewName1", "NewName2")}
  • 通常避免 for 循环,它们在 R 中比其他解决方案慢,例如下面 Jilber 答案中的 apply 函数。有关原因的一些信息,see here
  • @Anonymouscoward: apply 并不比 for loop 快。 “apply 函数在其定义中有一个 for 循环。lapply 函数隐藏了循环,但执行时间往往大致等于显式 for loop”(burns-stat.com/pages/Tutor/R_inferno.pdf)。是什么让for loop 变慢并且占用内存的是循环中不断增长的对象。
  • @Tung,我们可能在这里陷入困境。 apply 确实隐藏了一个 for 循环,但 lapply 没有,at least explicitly

标签: r list for-loop dataframe iteration


【解决方案1】:
L <- lapply(L, function(x){
  colnames(x) <- c("NewName1", "NewName2")
  x
} )

【讨论】:

  • 我认为如果你能提供更多关于你的代码为什么以及如何工作但他没有的解释会更好。
  • 有道理,我唯一的问题是为什么函数末尾有“x”?感谢您的回答,它工作得很好,我能够使用“do.call("rbind", lapply(L, as.data.frame))" 将列表作为一个具有更改变量的数据集。
  • @Jake 你需要有x 和函数的结尾,因为lapply 中的匿名函数需要返回x,否则输出不会是正确的。跨度>
  • 好吧,这也是有道理的。我感谢您的解释。
  • 我在多个帖子中看到过这个解决方案,但我仍然感到困惑。我不应该期望在运行此函数后在每个数据框中看到更改的 colnames() 吗?当然,lapply 返回一个列表,但即使我将列表转换回数据框,列名仍然相同。帮忙?
猜你喜欢
  • 2023-01-19
  • 1970-01-01
  • 2020-04-25
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多