【问题标题】:How To Save Results Of A Nested Loop Separately For Each Unique Combination In R如何为 R 中的每个唯一组合分别保存嵌套循环的结果
【发布时间】:2020-03-09 20:24:38
【问题描述】:

如何保存嵌套循环的结果并单独保存到我的列表中?

我的data 看起来像这样:

> data
  id factor
1  1      A
2  2      B
3  1      A

然后我创建一个包含 4 个列表的空向量,因为 id 有 2 个唯一值,factor 有 2 个唯一值

data <- data.frame("id" = c(1, 2, 1), "factor" = c("A", "B", "A"))

empty <- vector(mode = "list", length = 4)
for(i in seq_along(unique(data$id))){
  for (j in seq_along(unique(data$factor))) {
    empty[[i*j]] <- data %>%
      filter(id == unique(id)[i] & factor == unique(factor)[j])
  }
}
empty[[1]]

> empty[[1]]
  id factor
1  1      A
2  1      A

> empty[[2]]
[1] id     factor
<0 rows> (or 0-length row.names)

empty[[1]] 有效,但从 empty[[2]]empty[[3]] 给了我一个空列表。我想我搞砸了empty[[i*j]] 部分。

【问题讨论】:

    标签: r dataframe nested-loops


    【解决方案1】:

    我将使用expand.grid 创建一个数据框,其中包含data 中变量的所有唯一组合,然后在表示该数据框中行的序列上运行一个更简单的for 循环。所以:

    combos <- with(data, expand.grid(id = unique(id), factor = unique(factor)))
    
    empty <- vector(mode = "list", length = nrow(combos))
    
    for (i in seq(nrow(combos))) {
    
      empty[[i]] <- filter(data, id == combos$id[i] & factor == combos$factor[i])
    
    }
    

    生成此列表:

    > empty
    [[1]]
      id factor
    1  1      A
    2  1      A
    
    [[2]]
    [1] id     factor
    <0 rows> (or 0-length row.names)
    
    [[3]]
    [1] id     factor
    <0 rows> (or 0-length row.names)
    
    [[4]]
      id factor
    1  2      B
    

    如果您想将空集的插槽保留为NULL,您可以将过滤步骤放在if 语句中。

    【讨论】:

      【解决方案2】:

      好吧,因为你没有任何 empty[[2]]empty[[3]] 的样本,因为它们对应于 1 B2 A,你应该得到 ​​p>

        id factor
      1  2      B
      

      empty[[4]]

      【讨论】:

      • 哦,对了,因为 2*1 等于 1*2。那么如何编写一个嵌套的for循环来保存所有组合的结果呢?
      • 我不明白这个问题?您已经拥有名为 empty 的列表,其中一些元素为空,而另一些则不是。
      猜你喜欢
      • 2017-04-16
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2023-03-20
      • 2014-02-21
      • 1970-01-01
      相关资源
      最近更新 更多