【问题标题】:Problem Iterating through dataframes contained in a list in R遍历 R 中列表中包含的数据帧的问题
【发布时间】:2020-03-22 08:45:10
【问题描述】:

上下文 我读了一个 csv 并将内容分成 11 个不同的数据框。 然后我将数据框放入这样的列表中。

SourceCSV= read.csv("dt1Summary.csv",header=TRUE, sep = ';')

df1=SourceCSV[SourceCSV$Number == 122]
df2=SourceCSV[SourceCSV$Number == 430]
...
df11=SourceCSV[SourceCSV$Number == 1830]

dfList = list(df1, df2, ..., df11)

然后我像这样用 NA-Values 清理了行的数据框

for (i in 1:length(dfList)) {
 dfList[[i]]=dfList[[i]][complete.cases(dfList[[i]]),]
}

现在,当我尝试为列表中的每个元素以相同的方式运行需要修改数据框中的单元格的任何代码时,我似乎无法弄清楚如何正确调用内容。

我想在每个数据框的每个单元格中添加一个值为 1 的列。

但是当我跑步时:

for (i in 1:length(dfList)){
    dfList[[i]]$extraCol = 1
}

数据框被 11 个值替换。

您能解释一下如何正确调用列表中数据框中的单元格吗? 以及如何在不使用长度方法的情况下正确循环列表?

【问题讨论】:

  • df1=SourceCSV[SourceCSV$Number == 122] 这看起来不正确。是不是少了一个逗号?
  • 试试:df_lst1 <- lapply(dfList, function(df) { df <- df %>% mutate(VAR = 1) }) (library(tidyerse))
  • 除此之外:您的循环为我工作:dfList = list(iris, iris); for (i in 1:length(dfList)){ dfList[[i]]$extraCol = 1 }
  • 实际上我刚刚意识到您的代码适用于我创建的虚拟列表数据框...您能提供一个可重现的示例吗? dput(YOURDATA)dput(head(YOURDATA)).

标签: r list dataframe for-loop iteration


【解决方案1】:

我已经使用自定义数据集尝试了您的代码,并且您的代码没有问题。这是我生成数据集并运行您发布的代码的代码:

dfList <- list("df1" = data.frame("x1" = rnorm(1000), 
                                  "x2" = rnorm(1000), 
                                  "x3" = rnorm(1000)), 
               "df2" = data.frame("x1" = rnorm(1000), 
                                  "x2" = rnorm(1000), 
                                  "x3" = rnorm(1000)), 
               "df3" = data.frame("x1" = rnorm(1000), 
                                  "x2" = rnorm(1000), 
                                  "x3" = rnorm(1000)))
dfList[[1]][c(15,108,201,405,673,702),] <- NA
dfList[[2]][c(105,18,207,504,67,802),] <- NA
dfList[[3]][c(150,408,102,566,773,902),] <- NA

for (i in 1:length(dfList)) {
  dfList[[i]]=dfList[[i]][complete.cases(dfList[[i]]),]
}
for (i in 1:length(dfList)){
  dfList[[i]]$extraCol = 1
}
dfList
$df1
          x1         x2         x3 extraCol
1  0.6898781 -0.1514055  1.2448713        1
2 -0.5443420 -0.8995352 -0.4034141        1
3  0.7767239  0.5620077  0.1774943        1
 [ reached 'max' / getOption("max.print") -- omitted 991 rows ]

$df2
          x1        x2         x3 extraCol
1 -0.7885374 0.9506792  0.6453008        1
2 -1.5811700 0.1110525 -0.3572549        1
3 -1.4067713 0.1001205 -0.8444532        1
 [ reached 'max' / getOption("max.print") -- omitted 991 rows ]

$df3
         x1         x2          x3 extraCol
1 1.5309524 -0.9326038 -0.04479456        1
2 0.5882008  0.9105592 -0.82232054        1
3 1.2161384 -0.4759543 -0.64703306        1
 [ reached 'max' / getOption("max.print") -- omitted 991 rows ]

但是,我认为您的问题是 df1=SourceCSV[SourceCSV$Number == 122] 和类似的行。我想你的SourceCSVdata.frame,所以你应该将它索引为df1=SourceCSV[SourceCSV$Number == 122,] 来索引数据框的所有列。检查dfX 对象是否为data.frames

另外,如果您想避免使用length() 函数,您可以使用lapply 将函数应用于dfList 中的每个data.frame

dfList <- lapply(dfList, function(x) {x[complete.cases(x),]})
dfList <- lapply(dfList, function(x) {x$extraCol = 1; return(x)})  

【讨论】:

  • 感谢 lapply 的提示非常有用。虽然我在这里只忘记了我的问题中的逗号而不是我的代码,但我发现了我犯的一些错误:1。我使用 length() 来遍历数据帧,却不知道它遍历的是列而不是行。我用 nrow() 替换它并得到了结果。 2.在变量选项卡中,我没有看到变量发生变化,但我看到列表在完成案例执行后从 9.3 mb 变为 9.2 mb。所以我认为我的 df 变量会改变,但它们没有。只有列表元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2015-04-19
  • 2020-04-26
  • 2021-11-22
  • 2017-12-14
相关资源
最近更新 更多