当前位置: 首页 > 知识库问答 >
问题:

寻找函数或公式,使用tidyverse为许多组和许多变量创建平均值和标准偏差表

郭修平
2023-03-14

我需要准备一个表格,其中包括几个人口统计变量和许多变量的每个级别的平均值和标准偏差。

考虑以下数据:

df <- tibble(place=c("London","Paris","London","Rome","Rome","Madrid","Madrid"),gender=c("m","f","f","f","m","m","f"), education = c(1,1,2,3,5,5,3), var1 = c(2.2,3.1,4.5,1,5,1.4,2.3),var2 = c(4.2,2.1,2.5,4,5,4.4,1.3),var3 = c(0.2,0.1,3.5,3,5,2.4,4.3))

我想得到一个数据框,其中包含第一列中的分组变量(地点、性别、教育)及其级别(例如伦敦、巴黎等),以及其他列中以var(var1、var2、var3)开头的每个变量的均值和标准偏差。

我知道如何一次为一个组和几个变量执行此操作。但是,由于我需要重复几十次,因此我正在寻找一种自动化此过程的方法。如果有一个函数,我只需要传递(a)分组变量的名称(例如,性别,教育)和(b)从中获取M / SD的变量(例如var1,var2),那就太好了。

我寻找的解决方案应该看起来像这样(在下面的示例中,统计数据不正确):

my_results <- tibble(grouping_vars = c("place_London","place_Paris","place_Rome","place_Madrid","gender_m","gender_f","last_element"),mean_var1=c(1.3,2.5,4.5,1.7,2.5,3.6,4.0),sd_var1=c(0.01,0.41,0.21,0.12,0.02,0.38,0.28),mean_var2=c(4.3,4.5,4.0,1.2,2.5,1.6,2.3),sd_var2=c(0.21,0.1,0.1,0.32,0.22,0.18,0.08),mean_var3=c(2.3,2.5,2.0,3.2,3.5,0.6,5),sd_var3=c(0.51,0.15,0.51,0.52,0.52,0.15,0.48))

  grouping_vars  mean_var1 sd_var1 mean_var2 sd_var2 mean_var3 sd_var3
  <chr>              <dbl>   <dbl>     <dbl>   <dbl>     <dbl>   <dbl>
1 place_London         1.3    0.01       4.3    0.21       2.3    0.51
2 place_Paris          2.5    0.41       4.5    0.1        2.5    0.15
3 place_Rome           4.5    0.21       4      0.1        2      0.51
4 place_Madrid         1.7    0.12       1.2    0.32       3.2    0.52
5 gender_m             2.5    0.02       2.5    0.22       3.5    0.52
6 gender_f             3.6    0.38       1.6    0.18       0.6    0.15
7 last_element         4      0.28       2.3    0.08       5      0.48

因为我通常使用tidyverse,所以我特别喜欢使用这些包的解决方案(可能是dplyr或purrr?)。

我认为使用map()会有一种优雅的方式来做到这一点。也许有,但是我还没有找到。与此同时,我想出了一种简单的方法,将数据重组为适当的长格式,然后计算统计数据。

df %>% 
  # all grouping vars need to be of the same type, here "factor" is most appropriate
  mutate_at(grouping_vars, list(factor)) %>%
  # pivot longer, so that each row is a unique combination of grouping variable and grouping level
  pivot_longer(
    cols = one_of(grouping_vars), 
    names_to = "group_var",
    values_to = "group_level"
  ) %>% 
  # merge grouping variable and group level into a single column 
  unite(var_level,group_var,group_level, sep="_") %>% 
  # group by group level
  group_by(var_level) %>% 
  # compute means and sd for each test variable
  summarise_at(test_vars,  list(~mean(., na.rm = TRUE), ~sd(., na.rm = TRUE)))

结果似乎不错,例如,住在伦敦的两个人的var1平均值(2.24.5)为3.35。

# A tibble: 10 x 7
   var_level    var1_mean var2_mean var3_mean var1_sd var2_sd var3_sd
   <chr>            <dbl>     <dbl>     <dbl>   <dbl>   <dbl>   <dbl>
 1 education_1       2.65      3.15      0.15   0.636   1.48   0.0707
 2 education_2       4.5       2.5       3.5   NA      NA     NA     
 3 education_3       1.65      2.65      3.65   0.919   1.91   0.919 
 4 education_5       3.2       4.7       3.7    2.55    0.424  1.84  
 5 gender_f          2.72      2.48      2.72   1.47    1.13   1.83  
 6 gender_m          2.87      4.53      2.53   1.89    0.416  2.40  
 7 place_London      3.35      3.35      1.85   1.63    1.20   2.33  
 8 place_Madrid      1.85      2.85      3.35   0.636   2.19   1.34  
 9 place_Paris       3.1       2.1       0.1   NA      NA     NA     
10 place_Rome        3         4.5       4      2.83    0.707  1.41  

对这种方法可能存在的风险或如何改进有什么想法吗?

共有1个答案

晋功
2023-03-14

一个选项是psych中的description beBy函数

library(psych)
describeBy(df,group = c("gender","education"), mat= TRUE)

然后从那里把你想要的子集。

< code>dplyr的另一个令人惊讶的简单选项:

library(dplyr)
group.vars <- c("gender","education")
measure.vars <- c("var1","var2")

df %>% 
  group_by_at(group.vars) %>%
  summarize_at(measure.vars,
                      list(mean =~ mean(.),sd =~ sd(.)))
# A tibble: 5 x 6
# Groups:   gender [2]
  gender education var1_mean var2_mean var1_sd var2_sd
  <chr>      <dbl>     <dbl>     <dbl>   <dbl>   <dbl>
1 f              1      3.1       2.1   NA      NA    
2 f              2      4.5       2.5   NA      NA    
3 f              3      1.65      2.65   0.919   1.91 
4 m              1      2.2       4.2   NA      NA    
5 m              5      3.2       4.7    2.55    0.424

您可以继续向列表中添加额外功能。对于每个元素,名称将被附加到变量上,结果将是列值。回想一下,< code>~是< code>function(x)的简写。

 类似资料:
  • 我对标准差的计算有点执着,如果你能在下面的两个问题上给我一些帮助,那就太好了。 代码 问题1:我如何计算这个的标准误差(平均值的标准偏差)? 代码 问题2:如何计算累积标准偏差? 非常感谢!!(很抱歉数据格式错误!)

  • 概览 我有一个名为“subset_leaf_1”的数据集(见下文),显示了气候环境如何影响一种名为“栎树”的特定橡树物种的树冠指数。 我有一个名为Urbanisation_index(即下面的数据框)的列,其中包含四个子级别(即1,2,3和4)。每个子级别(1-4)都突出了围绕“栎属植物”的城市化程度。 我还想计算城市化指数各子级别的平均冠层指数。 问题 我想在dplyr包中使用data.tabl

  • 本文向大家介绍使用NumPy的绝对偏差和绝对均值偏差,包括了使用NumPy的绝对偏差和绝对均值偏差的使用技巧和注意事项,需要的朋友参考一下 在统计分析中对样本中数据变异性的研究表明,给定数据样本中的值有多分散。计算变异性的两个重要方法是绝对偏差和 均值绝对偏差。 绝对偏差 在这种方法中,我们首先找到给定样本的平均值,然后计算每个值与样本平均值之间的差,称为每个数据样本的绝对偏差值。因此,对于高于平

  • 我想用excel计算三个月内三名员工的销售标准差和平均值。是否有一个公式可以根据所选员工姓名给出该公式?我希望它是一个可重复和可扩展的公式,适用于100名员工。另外,我不想在这里使用pivot功能,因为我想在pivot字段中使用std-dev和average。输入输入 输出

  • 我的数据与此类似: 我需要计算基于名称组的差异列的标准偏差。 我试过了 和 但两者都为传递给的变量提供了KeyError。我试图用以下方法解决它: 但错误仍然存在。 提前谢谢。

  • 问题内容: 这是我的问题,我有一个像这样的数据框: 我只想计算整个数据帧的平均值,因为以下方法不起作用: 然后我想出了: 但是,此技巧不适用于计算标准偏差。我最后的尝试是: 除了在后一种情况下,它使用了numpy中的mean()和std()函数。这不是平均值的问题,而是std的问题,因为pandas函数默认使用,而不是numpy的where 。 问题答案: 您可以将数据框转换为单列(将形状从5x3