для цикла в R не дает желаемого выхода - PullRequest
0 голосов
/ 04 марта 2019

В R, когда я ввожу следующий код в набор данных радужной оболочки:

iris %>% 
  filter(Petal.Width == 0.2 & Species == "setosa") %>% 
  dim()

, я получаю

[1] 29  5

Я хотел бы перебрать значения, где Petal.Width = 0.1, 0,2, 0,3, 0,4, 0,5 и получите 5 разных выходов.

list1 = list(0.1, 0.2, 0.3, 0.4, 0.5)
for(i in list1){
  df_test <- iris %>% 
    filter(Petal.Width == i & Species == "setosa") %>% 
    dim()
}
df_test

Однако приведенный выше код возвращает только один вывод:

[1] 1 5

Почему это происходит и как я могу это сделать?заставить его вернуть 5 выходов вместо этого?

1 Ответ

0 голосов
/ 04 марта 2019

Здесь нет необходимости в явном цикле for;Лучше использовать map (или lapply в базе R) вместо

library(tidyverse)
map(list1, ~iris %>%
  filter(Petal.Width == .x & Species == "setosa") %>%
  dim())
#[[1]]
#[1] 5 5
#
#[[2]]
#[1] 29  5
#
#[[3]]
#[1] 7 5
#
#[[4]]
#[1] 7 5
#
#[[5]]
#[1] 1 5

Выходной объект - list.


В ответ на ваш комментарий вы можете использовать вложенный map

map(setNames(list1, list1), function(x) map(setNames(list2, list2), function(y) iris %>%
    filter(Petal.Width == x & Species == y) %>%
    dim()))
#$`0.1`
#$`0.1`$setosa
#[1] 5 5
#
#$`0.1`$versicolor
#[1] 0 5
#
#$`0.1`$virginica
#[1] 0 5
#
#
#$`0.2`
#$`0.2`$setosa
#[1] 29  5
#
#$`0.2`$versicolor
#[1] 0 5
#
#$`0.2`$virginica
#[1] 0 5
#
#
#$`0.3`
#$`0.3`$setosa
#[1] 7 5
#
#$`0.3`$versicolor
#[1] 0 5
#
#$`0.3`$virginica
#[1] 0 5
#
#
#$`0.4`
#$`0.4`$setosa
#[1] 7 5
#
#$`0.4`$versicolor
#[1] 0 5
#
#$`0.4`$virginica
#[1] 0 5
#
#
#$`0.5`
#$`0.5`$setosa
#[1] 1 5
#
#$`0.5`$versicolor
#[1] 0 5
#
#$`0.5`$virginica
#[1] 0 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...