繁体   English   中英

如何计算 R 中组的多个均值和标准差

[英]How I can calculate multiple means and standard deviations for groups in R

我努力为 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

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

这是一种使用 development 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 包(v0.3.0) 于 2019 年 8 月 15 日创建

使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM