[英]tidyverse summarize multiple columns but show result as rows
我有數據,我想使用 tidyverse 方法獲取多個列的匯總統計信息。 但是,利用 tidyverse 的summarize
function,它會將每個列統計信息創建為一個新列,而我更願意將列名視為行並將每個統計信息視為一個新列。 所以我的問題是:
是否有比通過帶有pivot_longer
和pivot_wider
的summarize
function 更優雅(我知道“優雅”是一個模糊的術語)的方式來實現這一點?
我正在使用 tidyverse package 的最新開發版本,即 dplyr 0.8.99.9003 和 tidyr 1.1.0。 因此,如果任何解決方案都需要這些軟件包中尚未出現在 CRAN 上的新功能,那很好。
library(tidyverse)
dat <- as.data.frame(matrix(1:100, ncol = 5))
dat %>%
summarize(across(everything(), list(mean = mean,
sum = sum))) %>%
pivot_longer(cols = everything(),
names_sep = "_",
names_to = c("variable", "statistic")) %>%
pivot_wider(names_from = "statistic")
預期結果:
# A tibble: 5 x 3
variable mean sum
<chr> <dbl> <dbl>
1 V1 10.5 210
2 V2 30.5 610
3 V3 50.5 1010
4 V4 70.5 1410
5 V5 90.5 1810
注意:我沒有設置任何列的名稱,所以如果有一種很好的方法可以獲取具有不同/通用名稱的表結構,那也可以。
不是一個tidyverse
解決方案,而是一個data.table
代替.. 另外,不確定它是否更“優雅”;-)
但在這里你 go...
library( data.table )
#make 'dat' a data.table
setDT(dat)
#transpose, keeping column names
dat <- transpose(dat, keep.names = "var_name" )
#melt to long and summarise
melt(dat, id.vars = "var_name")[, .(mean = mean(value), sum = sum(value) ), by = var_name]
# var_name mean sum
# 1: V1 10.5 210
# 2: V2 30.5 610
# 3: V3 50.5 1010
# 4: V4 70.5 1410
# 5: V5 90.5 1810
您可以通過在names_to
中使用".value"
來跳過pivot_wider
步驟。
library(dplyr)
dat %>%
summarise_all(list(mean = mean,sum = sum)) %>%
tidyr::pivot_longer(cols = everything(),
names_sep = "_",
names_to = c("variable", ".value"))
# A tibble: 5 x 3
# variable mean sum
# <chr> <dbl> <int>
#1 V1 10.5 210
#2 V2 30.5 610
#3 V3 50.5 1010
#4 V4 70.5 1410
#5 V5 90.5 1810
您可以先將所有列堆疊在一起並按組匯總。
dat %>%
pivot_longer(everything()) %>%
group_by(name) %>%
summarise_at("value", list(~mean(.), ~sum(.)))
# # A tibble: 5 x 3
# name mean sum
# <chr> <dbl> <int>
# 1 V1 10.5 210
# 2 V2 30.5 610
# 3 V3 50.5 1010
# 4 V4 70.5 1410
# 5 V5 90.5 1810
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.