цикл for для нескольких фреймов данных различной длины - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь добавить новый столбец к нескольким фреймам данных различной длины.

Например, у меня есть три кадра данных, как показано ниже:

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 голосов
/ 13 ноября 2018

Использование lapply:

iris.list <- lapply(iris.list, function(x) cbind(x, Sepal = rowMeans(x[, c("Sepal.Length", "Sepal.Width")], na.rm = T)))
0 голосов
/ 13 ноября 2018

Возможно, это не лучший способ, но мне нравится использовать этот метод, чтобы его было легче читать, когда я возвращаюсь к своему коду:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...