在具有不同长度的多个数据帧上进行循环

时间:2018-11-12 23:58:16

标签: r for-loop

我正在尝试将新列添加到具有不同长度的多个数据帧中。

例如,我有以下三个数据帧:

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与具有不同的长度。)

2 个答案:

答案 0 :(得分:0)

这可能不是最好的方法,但是我想使用此方法使返回代码时更容易阅读:

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
}

答案 1 :(得分:0)

使用lapply

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