【问题标题】:Calculate standard deviation across multiple rows grouped by ID计算按 ID 分组的多行的标准差
【发布时间】:2020-11-08 05:21:01
【问题描述】:

我想计算多行(不是每行)的标准偏差,然后将结果保存到新的数据框中。最好用一个例子来解释。

数据:

ID <- c("a","a","a","a","b","b","b","b","c","c","c","c")
y1 <- c(8,9,3,6,6,4,5,8,7,5,8,1)
y2 <- c(3,6,6,1,7,3,8,7,5,8,1,7)
y3 <- c(9,3,1,8,4,6,3,8,4,6,5,7)
df <- data.frame(ID, y1, y2, y3)

   ID y1 y2 y3
1   a  8  3  9
2   a  9  6  3
3   a  3  6  1
4   a  6  1  8
5   b  6  7  4
6   b  4  3  6
7   b  5  8  3
8   b  8  7  8
9   c  7  5  4
10  c  5  8  6
11  c  8  1  5
12  c  1  7  7

我想计算 ID$a、ID$b 和 ID$c 的标准差并存储在一个新的数据框中。我知道我可以做到:

sd_a <- sd(as.matrix(subset(df, ID == "a")), na.rm = TRUE)
sd_b <- sd(as.matrix(subset(df, ID == "b")), na.rm = TRUE)
sd_c <- sd(as.matrix(subset(df, ID == "c")), na.rm = TRUE)

ID <- c("a","b","c")
sd <- c(sd_a,sd_b,sd_c)
df2 <- data.frame(ID, sd)

  ID       sd
1  a 2.958040
2  b 1.912875
3  c 2.386833

但是有没有更直接的方法来实现这一点?

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    您可以使用pivot_longer()y1叠加到y3,然后计算sd

    library(dplyr)
    library(tidyr)
    
    df %>%
      pivot_longer(y1:y3) %>%
      group_by(ID) %>%
      summarise(sd = sd(value))
    
    # # A tibble: 3 x 2
    #   ID       sd
    #   <chr> <dbl>
    # 1 a      2.96
    # 2 b      1.91
    # 3 c      2.39
    

    【讨论】:

      【解决方案2】:

      dplyr 的一个解决方案可能是:

      df %>%
       group_by(ID) %>%
       summarise(sd = sd(unlist(cur_data())))
      
        ID       sd
        <fct> <dbl>
      1 a      2.96
      2 b      1.91
      3 c      2.39
      

      【讨论】:

        【解决方案3】:

        在基础 R 中你可以这样做:

        aggregate(values ~ ID, cbind(df[1], stack(df[-1])), sd)
        
          ID   values
        1  a 2.958040
        2  b 1.912875
        3  c 2.386833
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-17
          • 1970-01-01
          • 2020-06-14
          • 2019-08-15
          相关资源
          最近更新 更多