Как использовать table () с dplyr group by, map из purrr и списком фреймов данных / таблиц)? (В R) - PullRequest
1 голос
/ 23 февраля 2020

Вопрос Как создать таблицы, используя table () со списком фреймов данных / таблиц, с группировкой по двум переменным (пример: последовательность дней (например, {1,2, ...) , 10}) и коэффициент {0,1,2,3,4})

Пример данных

example:
ldf<-lapply(1:30, function(x) as.data.frame(cbind(sample(1:3,10,replace=T), sample(1:3,10,replace=T), seq(1:5), sample(0:4,10,replace=T))))
example:

  [[1]]
   V1 V2 V3 V4
1   3  1  1  4
2   1  3  2  2
3   2  2  3  3
4   3  1  4  1
5   1  1  5  3
6   1  1  1  4
7   1  1  2  2
8   3  3  3  3
9   2  2  4  1
10  1  1  5  3

[[2]]
   V1 V2 V3 V4
1   2  1  1  2
2   3  1  2  0
3   1  1  3  4
4   3  1  4  0
5   2  1  5  0
6   2  2  1  2
7   2  2  2  0
8   2  2  3  4
9   2  1  4  0
10  2  3  5  3
...

Где V1 и V2 - переходные состояния, которые я хочу представить, например. таблица (df $ V1, df $ V2), & V3 (день) и V4 (коэффициент от 0 до 4), по которым я хочу сгруппировать.

Ожидаемый результат

Я хотел бы получить таблицу, сгруппированную по V3 и V4 для каждого data.frame / tibble в списке data.frame / tibbles и сохранить ее обратно в другой список объектов.

visual example (not actual data)

data.frame 1 
group by v3=1 & v4=0
  1 2 3
1 0 1 2
2 0 3 4
3 4 5 6 

data.frame 1
group by v3=1 & v4=1
  1 2 3
1 1 7 8
2 2 6 9
3 4 5 0 

...

data.frame 1
group by v3=2 & v4=0
  1 2 3
1 5 4 4
2 6 5 3
3 7 8 4

...

data.frame 2

...

data.frame 3

...

etc...

1 Ответ

2 голосов
/ 23 февраля 2020

Мы можем split data.frame по 'V3', 'V4' и получить table из 'V1', 'V2'

lst2 <- lapply(ldf[1:2], function(dat) lapply(split(dat[1:2], 
               dat[3:4], drop = TRUE), function(x) {
                 lvls <- sort(unique(unlist(x)))
                 table(factor(x[[1]], levels = lvls), factor(x[[2]], levels = lvls))
                  }))

С tidyverse вот вариант

library(purrr)
library(tidyr)
library(dplyr)
map(ldf[1:2], ~
        .x %>%
           group_split(V3, V4) %>%
           map(~ .x %>% 
                 unite(V3V4, V3, V4) %>%
                 group_by_all %>% 
                 summarise(n = n()) %>% 
                 ungroup %>% 
                 complete(V1 = sort(unique(unlist(select(., V1, V2)))),
                          V2 = sort(unique(unlist(select(., V1, V2)))), 
                      fill = list(n = 0) )  %>%
                 pivot_wider(names_from = V2, values_from = n, 
                    values_fill = list(n = 0)) %>% 
                 fill(V3V4, .direction = "updown")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...