【问题标题】:how to get average of specific row如何获得特定行的平均值
【发布时间】:2017-10-27 03:08:38
【问题描述】:

我有这样的数据

df<- structure(list(X1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), X2 = structure(c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 
16L, 17L, 18L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L, 13L, 14L, 15L, 16L, 17L, 18L), .Label = c("B02", "B03", 
"B04", "B05", "B06", "B07", "C02", "C03", "C04", "C05", "C06", 
"C07", "D02", "D03", "D04", "D05", "D06", "D07"), class = "factor"), 
    X3 = c(1146L, 1246L, 1624L, 650L, 874L, 1267L, 1951L, 1214L, 
    1275L, 1398L, 1199L, 1268L, 849L, 1268L, 1212L, 835L, 1246L, 
    1188L, 1172L, 1164L, 1251L, 845L, 1167L, 1113L, 818L, 1125L, 
    1130L, 1186L, 1221L, 1176L, 1223L, 877L, 1253L, 1253L, 1253L, 
    1253L)), .Names = c("X1", "X2", "X3"), class = "data.frame", row.names = c(NA, 
-36L))

我正在尝试获取特定行的平均值

X1 为 1 时的 B02 到 B05(称为 DF1)

1   B02 1146
1   B03 1246
1   B04 1624
1   B05 650

X1 为 2 时的 B02 到 B05(称为 DF2)

2   B02 1172
2   B03 1164
2   B04 1251
2   B05 845

然后在X1为1时取C02和D02的平均值(称为DF3)

1   C02 1951
1   D02 849

然后在X1为2时取C02和D02的平均值(称为DF4)

2   C02 818
2   D02 1223

和底物平均值DF1-DF3和DF2-DF4

【问题讨论】:

    标签: r


    【解决方案1】:

    这里是tidyverse 版本

    library(tidyverse)
    

    创建“查找表”

    d1 <- c("B02", "B03", "B04", "B05")
    d3 <- c("C02", "D02")
    

    使用case_when 指定行

    df %>% 
      mutate(DF = case_when(X1==1 & X2 %in% d1 ~ 'DF1',
                            X1==2 & X2 %in% d1 ~ 'DF2',
                            X1==1 & X2 %in% d3 ~ "DF3",
                            X1==2 & X2 %in% d3 ~ "DF4")) %>% 
      drop_na %>% 
      group_by(DF) %>% 
      summarise(means = mean(X3)) %>% 
      summarise(DF13 = means[3]-means[1],
                DF24 = means[2]-means[4])
    

    你可以通过使用 mutate 而不是最后的 summarise 来获得 SD

      summarise(means = mean(X3), sd = sd(X3)) %>% 
      mutate(DF13 = means[3]-means[1],
                DF24 = means[2]-means[4],
                SD = sd)
    

    【讨论】:

    • @B Williams 你能把标准差加进去吗?我会喜欢并接受你的回答
    • 要获得 SD,我只需将其添加到第一个汇总 summarise(means = mean(X3), SD = sd(X3)) 并删除第二个汇总以区分值。
    • @B Williams mean类似于 xls 中的 average
    • 应该DF13 = means[3]-means[1]DF13 = means[1]-means[3]
    【解决方案2】:

    如果我理解正确,我认为这个过程可以稍微简化,因为X1 中的每个组都在重复相同的过程。基于@BWilliams 的现有答案,我们可以这样做:

    library(dplyr)
    library(tidyr)
    
    d12 <- c("B02", "B03", "B04", "B05")
    d34 <- c("C02", "D02")
    result <- df %>% 
      mutate(DF = case_when(X2 %in% d12 ~ 'DF12',
                            X2 %in% d34 ~ "DF34")) %>% 
      drop_na %>% 
      group_by(X1, DF) %>% 
      summarise(means = mean(X3), SD = sd(X3))
    result
    #> # A tibble: 4 x 4
    #> # Groups:   X1 [?]
    #>      X1    DF  means       SD
    #>   <int> <chr>  <dbl>    <dbl>
    #> 1     1  DF12 1166.5 401.1729
    #> 2     1  DF34 1400.0 779.2317
    #> 3     2  DF12 1108.0 179.6756
    #> 4     2  DF34 1020.5 286.3782
    

    然后可以通过从first 中减去last 均值来获得最终的均值差。

    result %>% summarise(mean_diff = first(means) - last(means))
    #> # A tibble: 2 x 2
    #>      X1 mean_diff
    #>   <int>     <dbl>
    #> 1     1    -233.5
    #> 2     2      87.5
    

    【讨论】:

    • 我喜欢你的回答
    猜你喜欢
    • 2012-08-16
    • 2012-03-18
    • 2022-08-14
    • 2020-10-11
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2021-02-08
    • 2015-09-11
    相关资源
    最近更新 更多