[英]dplyr count single observations in list of tibbles using purrr::map
[英]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.