【问题标题】:for loop in R not producing desired outputR中的for循环没有产生所需的输出
【发布时间】:2019-03-04 08:25:32
【问题描述】:

在 R 中,当我在 iris 数据集中输入以下代码时:

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 个输出?

【问题讨论】:

  • 您需要创建一个空列表并在每次迭代时填充它。如果事先知道维度,最好先定义维度。
  • l &lt;- list() 在循环外,然后用l[i] &lt;- 在里面赋值。
  • df_test每次迭代都会修改,最后你只有最后一个
  • @RLave 创建一个空列表并动态填充它是可能的,但效率不高。最好使用map(或lapply)。
  • 我同意,我只是指出错误。另外我建议最好先定义输出的维度。

标签: r for-loop tidyverse


【解决方案1】:

这里不需要显式的for 循环;最好改用map(或基础R中的lapply

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

【讨论】:

  • 如果我现在还想循环遍历 list1 和所有 Species 值,该怎么办?在这种情况下,我创建list2 = list("setosa", "versicolor", "virginica")。我希望有 15 个输出,因为我想要 list1 和 list2 的所有组合?
  • @wussyx 我会使用嵌套的map 方法,请参阅我的更新。然后 flatten 根据需要嵌套 list
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
相关资源
最近更新 更多