【问题标题】:for loop on multiple data frames with different lengths在具有不同长度的多个数据帧上循环
【发布时间】:2018-11-12 23:58:15
【问题描述】:

我正在尝试向具有不同长度的多个数据框添加新列。

例如,我有如下三个数据框:

iris1 <- iris[iris$Species=="setosa" & iris$Petal.Width == 0.2,]
iris2 <- iris[iris$Species=="versicolor",]
iris3 <- iris[iris$Species=="virginica",]

我可以使用以下行向单个数据框添加一列:

iris1$Sepal <- rowMeans(iris1[, c("Sepal.Length", "Sepal.Width")], na.rm = T)

所以我尝试编写一个for 循环来为多个数据帧重复此操作,如下所示,但它只是创建了一个新的数据帧i,我无法确定编写正确的循环。

iris.list <- list(iris1, iris2, iris3)
for (i in iris.list) {
  i$Sepal <- rowMeans(i[, c("Sepal.Length", "Sepal.Width")], na.rm = T)
}

(我在 StackOverflow 上搜索并注意到人们还建议尽可能使用 apply 而不是 for 循环,但无法让 apply 处理我的具有不同长度的数据帧。)

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    使用lapply

    iris.list <- lapply(iris.list, function(x) cbind(x, Sepal = rowMeans(x[, c("Sepal.Length", "Sepal.Width")], na.rm = T)))
    

    【讨论】:

      【解决方案2】:

      这可能不是最好的方法,但我喜欢使用这种方法,以便在我回到我的代码时更容易阅读:

      for (i in 1:length(iris.list)){
          currIris <- iris.list[[i]]
          currIris$Sepal <- rowMeans(currIris[, c("Sepal.Length", "Sepal.Width")], na.rm = T)
          iris.list[[i]] <- currIris
      }
      

      【讨论】:

        猜你喜欢
        • 2015-07-25
        • 1970-01-01
        • 2020-11-30
        • 1970-01-01
        • 1970-01-01
        • 2017-05-06
        • 2021-11-25
        • 1970-01-01
        • 2021-10-04
        相关资源
        最近更新 更多