如何为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]]部分搞砸了。

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

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

id factor
1  2      B

对于CCD_ 17。

最新更新