如何为 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 B
和 2 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
语句中。
如何保存嵌套循环的结果并单独保存到列表中?
我的 data
看起来像这样:
> data
id factor
1 1 A
2 2 B
3 1 A
然后我制作了一个包含 4 个列表的空向量,因为 id
有 2 个唯一值,factor
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 B
和 2 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
语句中。