首页 > 解决方案 > R:如何更改通过 for 循环中的变量创建的数据框的单元格值

问题描述

我需要更新通过 for 循环中的变量创建的数据框的单元格值

创建大法框架

df <- data.frame(
  col1 = c(rep(1,9)),
  col2 = c(rep(2,9)),
  col3= c(rep(3, 9))
)
df
  col1 col2 col3
1    1    2    3
2    1    2    3
3    1    2    3
4    1    2    3
5    1    2    3
6    1    2    3
7    1    2    3
8    1    2    3
9    1    2    3

拆分为 3 个数据帧,即 df1,df2,df3 实际数据集更复杂,但是,目标是在 for 循环中更新拆分数据帧,即 df1-3。这是因为我的数据集非常大。

我尝试了注释的代码行,但它给了我一个新变量,粘贴函数中的相应名称为它分配了一个值 0

for(i in seq(1,3,1)){
  if (i == 1) {
  assign(paste0("df",i),df[1:3,])
  #assign(paste0("df",i,"$col2[1]"),0)
  }
  if (i == 2 ){
  assign(paste0("df",i),df[4:6,])
  #assign(paste0("df",i,"$col2[1]"),0)
  }
  if (i == 3 ){
  assign(paste0("df",i),df[7:9,])
  #assign(paste0("df",i,"$col2[1]"),0)
  } 
}

df1
  col1 col2 col3
1    1    2    3
2    1    2    3
3    1    2    3

预期输出 我需要使用 for 循环将每个拆分数据帧的 col2 中的第一行更新为 0。

df1
  col1 col2 col3
1    1    0    3
2    1    2    3
3    1    2    3
Same for df2 and df3

标签: rdataframefor-loopvariables

解决方案


我可以提供一种替代方法吗?与其创建几个不同的 data.frame,不如创建一个 data.frame 列表(使用split)。然后您可以使用lapply在每个数据框元素中进行相同的更改:

lapply(split(df,paste0("df",rep(1:3,each=3))),function(x) {x[1,2]<-0;x})

$df1
  col1 col2 col3
1    1    0    3
2    1    2    3
3    1    2    3

$df2
  col1 col2 col3
4    1    0    3
5    1    2    3
6    1    2    3

$df3
  col1 col2 col3
7    1    0    3
8    1    2    3
9    1    2    3

如果出于某种原因,您绝对坚持从 for 循环开始创建数据帧(我强烈建议不要这样做),那么您可以使用 将它们全部放入一个列表中lapply(paste0("df",1:3),get),并用lapply我上面建议的方法将其包装起来,以得到相同的结果(但没有列表中每个数据框的有用元素名称)。


推荐阅读