Как сохранить результаты вложенного L oop отдельно для каждой уникальной комбинации в R - PullRequest
0 голосов
/ 09 марта 2020

Как мне сохранить результаты моего вложенного l oop и сохранить отдельно в моих списках?

Мой data выглядит так:

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

Затем я делаю пустой вектор из 4 списков, поскольку есть 2 уникальных значения для 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]] частью.

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Я бы сделал это, используя expand.grid, чтобы создать фрейм данных со всеми уникальными комбинациями ваших переменных в data, а затем выполнить более простой for l oop над последовательностью, представляющей строки в этом фрейме данных. , Итак:

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 заявление.

0 голосов
/ 09 марта 2020

Ну, потому что у вас нет образцов для empty[[2]] и empty[[3]], поскольку они соответствуют 1 B и 2 A, и вы должны получить

  id factor
1  2      B

для empty[[4]] .

...