应用分组和权重时,如何使用数据框中所有列的摘要工具计算频率和描述性统计数据?

问题描述 投票:0回答:1

在 R 中,我有一个数据框 (mydf),如下所示:

重量 性别 var1 var2
100 M 1 3
800 F 2 8
10 F 2 9
150 F 4 10

(但有 100 列(var3、var 4 等)和 2000 行)。

我想计算按性别分组的每个变量(“var”列)的加权频率和描述性统计数据。对于未分组的数据,我使用了summarytools包计算频率和描述性统计数据(freq和descr函数),效果很好。我的代码是:

## generate descriptive stats and specify weight
mydf_descr <- descr(mydf, weights = mydf$weight)

## generate frequency tables and specify weight
mydf_freq <- freq(mydf, weights = mydf$weight)

但是,当我尝试应用分组时,我遇到了错误。我的代码是:

mydf_descr_gender <- mydf %>% 
group_by(gender) %>% 
descr(., weights = mydf$weight)

但是,我收到错误:

Error in descr(x = as_tibble(var_obj)[gr_inds[[g]], ], stats = stats,  : 
  weights vector must have same length as 'x'

我对 freq 函数也得到了同样的结果。

我也尝试过:

mdf_freq_gen <- mydf %>%
    group_by(gender) %>%
    summarise_all(~ freq(., weights = weight))

并收到错误

Error in `summarise()`:
ℹ In argument: `var1 = (structure(function (..., .x = ..1, .y = ..2, . = ..1) ...`.
ℹ In group 1: `gender = 1`.
Caused by error in `freq()`:
! weights vector must have same length as 'x'
Run `rlang::last_trace()` to see where the error occurred.

我已经尝试了很多东西,但我似乎无法让它在分组时运行该函数并包含权重(没有权重它也可以正常工作)。我确信我错过了一些明显的东西!

任何帮助/想法将不胜感激!

r dplyr group-by frequency summarytools
1个回答
0
投票

您可以拆分数据集并将函数应用于每个子集。

library(dplyr)
library(summarytools)

mydf %>% 
  split(.$gender) %>% 
  purrr::map(~descr(.x, weights = .x$weight))

使用

group_map
也可以实现同样的效果。

mydf %>% 
  group_by(gender) %>% 
  group_map(~descr(.x, weights = .x$weight))
© www.soinside.com 2019 - 2024. All rights reserved.