簡體   English   中英

如何將 table() 與 dplyr group by、來自 purrr 的映射和數據幀/tibbles 列表一起使用? (在 R 中)

[英]How to use table() with dplyr group by, map from purrr and a list of dataframes/tibbles)? (In R)

問題如何使用 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 是我想要列出的過渡狀態,例如。 table(df$V1, df$V2), & V3 (the day) and V4 (a factor between 0-4) 我想分組。

預期輸出

我想為 data.frame/tibbles 列表中的每個 data.frame/tibble 獲取一個按 V3 和 V4 分組的表,並將其保存回另一個對象列表。

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...

我們可以split通過“V3”,“V4”的data.frame並獲得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")))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM