【问题标题】:How I can calculate multiple means and standard deviations for groups in R我如何计算 R 中组的多个均值和标准差
【发布时间】:2019-12-22 06:20:51
【问题描述】:

我努力计算 R 中多个组的多个均值和标准差。

这是我的数据:

df <- read.table(text="A1   B1  time1   A2  B2  time2   A3  B3  time3
m   p   12  m   p   11  n   q   12
n   q   12  m   p   13  n   q   14
n   q   11  n   p   14  m   p   14
n   q   10  n   q   15  m   p   12
m   p   8   n   q   12  m   p   11
",h=T)

我想根据时间 1、时间 2 和时间 3 计算组的 A1、B1、A2、B2、A3、B3 的平均值和 SD。感兴趣的输出是:

meanA1m x   meanA2m x   meanA3m x
meanA1n x   meanA2n x   meanA3n x
meanB1p x   meanB2p x   meanB3p x
meanB1q x   meanB2q x   meanB3q x
SDA1m   x   SDA2m   x   SDA3m   x
SDA1n   x   STA2n   x   STA3n   x
SDB1p   x   SDB2p   x   SDB3p   x
SDB1q   x   SDB2q   x   SDB3q   x

我已经寻找解决方案,但没有成功,或者我可能遗漏了一些东西。这些数据有什么解决办法吗?

【问题讨论】:

  • 您能否澄清一下计算meanA1m 时应使用的值,例如?是来自time1 列的 12 和 8 吗?很难理解你的数据结构
  • @Calum 你-谢谢。例如,时间 1 与 A1 和 B1。所以平均 A1m= 10,MeanB1p= 10 等等
  • 为什么你的数据很宽?保持长,聚合很简单。
  • @Parfait- 你能帮忙更多吗

标签: r dplyr mean tidyverse standard-deviation


【解决方案1】:

这是一种使用开发tidyr::pivot_longer 重塑此数据的方法,其格式非常混乱:

library(tidyverse)
df <- read.table(text = "A1 B1  time1   A2  B2  time2   A3  B3  time3
m   p   12  m   p   11  n   q   12
n   q   12  m   p   13  n   q   14
n   q   11  n   p   14  m   p   14
n   q   10  n   q   15  m   p   12
m   p   8   n   q   12  m   p   11
", h = T, stringsAsFactors = FALSE)

spec <- tibble(
  .name = colnames(df),
  .value = str_extract(.name, ".*(?=\\d)") %>% recode(time = "value"),
  time = str_extract(.name, "\\d")
)
df %>%
  pivot_longer_spec(spec = spec) %>%
  gather("AB", "AB_val", A, B) %>%
  group_by(AB, time, AB_val) %>%
  summarise(mean = mean(value), SD = sd(value))
#> # A tibble: 12 x 5
#> # Groups:   AB, time [6]
#>    AB    time  AB_val  mean    SD
#>    <chr> <chr> <chr>  <dbl> <dbl>
#>  1 A     1     m       10    2.83
#>  2 A     1     n       11    1   
#>  3 A     2     m       12    1.41
#>  4 A     2     n       13.7  1.53
#>  5 A     3     m       12.3  1.53
#>  6 A     3     n       13    1.41
#>  7 B     1     p       10    2.83
#>  8 B     1     q       11    1   
#>  9 B     2     p       12.7  1.53
#> 10 B     2     q       13.5  2.12
#> 11 B     3     p       12.3  1.53
#> 12 B     3     q       13    1.41

reprex package (v0.3.0) 于 2019 年 8 月 15 日创建

【讨论】:

  • 不确定为什么会出现此错误:pivot_longer_spec(., spec = spec) 中的错误:找不到函数“pivot_longer_spec”
  • 错误:无法从 GitHub 安装“tidyr”:
  • 请看上面Calum You@
  • 是的,这里又是包'tibble'成功解包和MD5和检查包'vctrs'成功解包和MD5和检查包'生命周期'成功解包和MD5和检查包'assertthat'成功解包和MD5 和检查包 'pillar' 成功解包和 MD5 和检查包 'backports' 成功解包和 MD5 和检查错误:无法从 GitHub 安装'tidyr':(从警告转换)无法删除包'backports'的先前安装跨度>
  • 同样的错误错误:无法从 GitHub 安装“tidyr”:(从警告转换)无法删除之前安装的包“digest”
【解决方案2】:

使用data.table,您可以获得与您想要的类似的东西:

#Adding id column to df    
df$id <- 1:nrow(df)  
library(data.table)
setDT(df)
#Reshape df from wide to long
df2 <- melt(df, id = c("id", "time1", "time2", "time3"))
#Compute the required means and sd.
df2[, .(mean1 = mean(time1), sd1 = sd(time1), 
        mean2 = mean(time2), sd2 = sd(time2),
        mean3 = mean(time3), sd3 = sd(time3)
        ),.(variable, value)]

#Returns
    variable value     mean1       sd1    mean2       sd2    mean3       sd3
 1:       A1     m 10.000000 2.8284271 11.50000 0.7071068 11.50000 0.7071068
 2:       A1     n 11.000000 1.0000000 14.00000 1.0000000 13.33333 1.1547005
 3:       B1     p 10.000000 2.8284271 11.50000 0.7071068 11.50000 0.7071068
 4:       B1     q 11.000000 1.0000000 14.00000 1.0000000 13.33333 1.1547005
 5:       A2     m 12.000000 0.0000000 12.00000 1.4142136 13.00000 1.4142136
 6:       A2     n  9.666667 1.5275252 13.66667 1.5275252 12.33333 1.5275252
 7:       B2     p 11.666667 0.5773503 12.66667 1.5275252 13.33333 1.1547005
 8:       B2     q  9.000000 1.4142136 13.50000 2.1213203 11.50000 0.7071068
 9:       A3     n 12.000000 0.0000000 12.00000 1.4142136 13.00000 1.4142136
10:       A3     m  9.666667 1.5275252 13.66667 1.5275252 12.33333 1.5275252
11:       B3     q 12.000000 0.0000000 12.00000 1.4142136 13.00000 1.4142136
12:       B3     p  9.666667 1.5275252 13.66667 1.5275252 12.33333 1.5275252

【讨论】:

  • 谢谢你,保罗-是否可以删除不相关的手段和 sds。例如,我只想为 A1 和 B1 设置 mean1 和 sd1,为 A2 和 B2 设置 mean2 和 sd2,为 A3 和 B3 设置 mean3 和 sd3。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2023-01-09
  • 2014-03-21
相关资源
最近更新 更多