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

如何计算按列名分组的数据帧/矩阵中的平均值和标准差

郑声
2023-03-14

示例数据

我想计算每个唯一列名称的平均值和标准偏差(忽略NA)以获得如下输出:

可再现数据:

df <- data.frame(c(1, 3.7, 1.5, 3.7, 2.9, 7),
                 c(2, 1, 0.4, NA, 1.1, 4.9),
                 c(1.1, 1, 2.1, 3.6, 10, 6.9),
                 c(4, 3.3, 3.3, 3.1, 7.1, 5.4),
                 c(9.8, NA, 6, 5.6, 7.7, 4.9))
names(df) <- c("sun", "sun", "sun", "sky", "sky")

我得到的最接近的是

#for mean
sapply(split.default(df, names(df)), rowMeans, na.rm = TRUE) 

#for sd
sapply(split.default(df, names(df)), function(x) apply(x, 1, sd, na.rm=TRUE))

这是我从这篇文章中得到的,但我不知道如何调整它来得到我想要的。我知道我可以取rowmeans的平均值来得到每组的平均值,但这不适用于标准差。

共有3个答案

公良扬
2023-03-14

这里是<code>dplyr<code>中的另一种方法,将类似命名列的值放入一列中,然后对它们计算<code>mean<code>和<code>sd<code>。

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = everything(), 
               names_to = '.value') %>%
  summarise(across(.fns = list(mean = ~mean(., na.rm = TRUE), 
                              sd = ~sd(., na.rm = TRUE))))

#  sun_mean sun_sd sky_mean sky_sd
#     <dbl>  <dbl>    <dbl>  <dbl>
#1     3.17   2.68     5.47   2.10

如果您希望均值标准差值在单独的列中,您可以添加到上述答案中-

 %>% pivot_longer(cols = everything(), names_to = c('col', '.value'), names_sep = '_')

#  col    mean    sd
#  <chr> <dbl> <dbl>
#1 sun    3.17  2.68
#2 sky    5.47  2.10
萧飞
2023-03-14

这里有一个< code>tidyverse解决方案

library(tidyverse)
df <- data.frame(c(1, 3.7, 1.5, 3.7, 2.9, 7),
                 c(2, 1, 0.4, NA, 1.1, 4.9),
                 c(1.1, 1, 2.1, 3.6, 10, 6.9),
                 c(4, 3.3, 3.3, 3.1, 7.1, 5.4),
                 c(9.8, NA, 6, 5.6, 7.7, 4.9))
names(df) <- c("sun", "sun", "sun", "sky", "sky")
df %>%
  #Pivotting data
  pivot_longer(cols = everything()) %>%
  #Grouping by sun/sky
  group_by(name) %>% 
  #Caluclating mean and sg grouped by sun/sky
  summarise(
    mean = mean(value,na.rm = T),
    sd = sd(value,na.rm = T)
  )
  name   mean    sd
  <chr> <dbl> <dbl>
1 sky    5.47  2.10
2 sun    3.17  2.68
郁吉星
2023-03-14

我们可以使用

t(sapply(split.default(df, names(df)), function(x)  {
    x1 <- unlist(x)
    data.frame(mean = mean(x1, na.rm = TRUE), sd = sd(x1, na.rm = TRUE))}))

-输出

       mean     sd      
sky 5.472727 2.102423
sun 3.170588 2.677631

或者使用< code>data.table

library(data.table)
melt(setDT(df), measure = patterns("^sun", "^sky"), 
  value.name = c("sun", "sky"))[, c(list(categ = c("mean", "sd")), 
    lapply(.SD, function(x) c(mean = mean(x, na.rm = TRUE), 
     sd = sd(x, na.rm = TRUE)))), .SDcols = sun:sky]
   categ      sun      sky
1:  mean 3.170588 5.472727
2:    sd 2.677631 2.102423
 类似资料:
  • 我有一个由66个变量的10299个观测值组成的数据框。其中一些变量共享一个通用的列名,我想计算每个观测值的这些变量的平均值。 具有以下矩阵,列名: 我想得到: 我尝试了循环,命令,但没有得到所需的结果。 抱歉,如果这个问题看起来太基本了,我已经在谷歌上查过可能的解决方案,但没有找到任何解决方案。

  • 我有一个大的数据帧,显示如下: 基本上,每当写完“状态”时,我都想根据“类型”计算平均值和中位数。到目前为止,我所做的是首先根据状态“完成”创建一个组,然后计算组的平均值和中位数,如下所示: 如何为“类型”添加一个参数,以便脚本也将根据“类型”估计每个组的中位数。 谢谢。

  • 问题内容: 我正在尝试使用下面的代码来计算用户输入的一组值的平均值,并将其显示在中,但它无法正常工作。假设用户输入7、4和5,该程序在应显示5.3时显示平均值。 代码有什么问题? 问题答案: 当您拥有增强的for循环时,为什么还要对索引使用笨拙的for循环?

  • 我使用Spark sql dataframes执行groupby操作,然后计算每组数据的平均值和中值。原始数据量约为1 TB。 当我运行该查询时,我的工作被卡住,无法完成。如何调试该问题?是否存在导致groupby()卡滞的按键不平衡?

  • 我在添加数组的所有元素以及求取它们的平均值时遇到了问题。我将如何做到这一点并用我当前拥有的代码实现它?这些元素应该定义如下。

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