如何为 R 中的每个唯一组合分别保存嵌套循环的结果

How To Save Results Of A Nested Loop Separately For Each Unique Combination In R

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

我的 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]] 部分。

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

  id factor
1  2      B

对于 empty[[4]]

我会使用 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 语句中。