【问题标题】:How to get the means of all columns but one?如何获得除一列之外的所有列的均值?
【发布时间】:2018-08-29 13:29:08
【问题描述】:

我有如下数据:

> dplyr::tbl_df(sbp)

Country X1980       X1981       X1982       X1983       X1984       X1985
Albania 132.9270    133.0296    133.1459    133.1868    133.2048    133.2577        
Algeria 132.4093    132.1710    131.9649    131.7835    131.6161    131.4345        
Andorra 140.8585    140.1076    139.3727    138.6457    137.9525    137.3192    

我想获取所有国家/地区每年的平均值,并在数据框的末尾添加一行,例如 World,这样我就可以以该格式绘制平均值随年份的变化。

我尝试使用gather(),这样我就有了一个只有三列的数据,比如 Country-year-value。但是我想不出一种方法来计算世界的平均值。

Country year    sbp
Albania X1980   132.9270        
Algeria X1980   132.4093        
Andorra X1980   140.8585    

你能建议吗?

【问题讨论】:

  • 你正在寻找类似sbp$mean = rowMeans(sbp[,-1])的东西?
  • df %>% select(-1) %>% colMeans()?然后可以将rbind 这些以领先值"World" 的数据添加到您的数据中。

标签: r multiple-columns mean


【解决方案1】:

这是apply 的一个很好的用例,无需转换原始格式:

1表示跨行计算,我们选择列2:6

df1$mean <- apply(df1[,2:6], 1, mean)

  Country    X1980    X1981    X1982    X1983    X1984    X1985     mean
1 Albania 132.9270 133.0296 133.1459 133.1868 133.2048 133.2577 133.0988
2 Algeria 132.4093 132.1710 131.9649 131.7835 131.6161 131.4345 131.9890
3 Andorra 140.8585 140.1076 139.3727 138.6457 137.9525 137.3192 139.3874

您并不想在主表中添加汇总行,这可能是您在 Excel 中的做法,但在 R 中,最好单独计算。

要获得每一年的平均值,我们也可以使用 apply,这次使用 apply 函数中的 2 来计算向下列:

apply(df1[,2:6], 2, mean)


   X1980    X1981    X1982    X1983    X1984 
135.3983 135.1027 134.8278 134.5387 134.2578 

【讨论】:

    【解决方案2】:

    基于 R 的可能解决方案:

    rbind(mydf, cbind(Country = 'World', as.data.frame.list(colMeans(mydf[,-1]))))
    

    给出:

      Country    X1980    X1981    X1982    X1983    X1984    X1985
    1 Albania 132.9270 133.0296 133.1459 133.1868 133.2048 133.2577
    2 Algeria 132.4093 132.1710 131.9649 131.7835 131.6161 131.4345
    3 Andorra 140.8585 140.1076 139.3727 138.6457 137.9525 137.3192
    4   World 135.3983 135.1027 134.8278 134.5387 134.2578 134.0038
    

    还有一个tidyverse 解决方案:

    mydf %>% 
      gather(year, sbp, -1) %>% 
      bind_rows(., mydf %>% 
                  gather(year, sbp, -1) %>%
                  group_by(year) %>%
                  summarise(Country = 'World', sbp = mean(sbp)))
    

    具有长格式输出:

       Country  year      sbp
    1  Albania X1980 132.9270
    2  Algeria X1980 132.4093
    3  Andorra X1980 140.8585
    4  Albania X1981 133.0296
    5  Algeria X1981 132.1710
    6  Andorra X1981 140.1076
    7  Albania X1982 133.1459
    8  Algeria X1982 131.9649
    9  Andorra X1982 139.3727
    10 Albania X1983 133.1868
    11 Algeria X1983 131.7835
    12 Andorra X1983 138.6457
    13 Albania X1984 133.2048
    14 Algeria X1984 131.6161
    15 Andorra X1984 137.9525
    16 Albania X1985 133.2577
    17 Algeria X1985 131.4345
    18 Andorra X1985 137.3192
    19   World X1980 135.3983
    20   World X1981 135.1027
    21   World X1982 134.8278
    22   World X1983 134.5387
    23   World X1984 134.2578
    24   World X1985 134.0038
    

    使用过的数据:

    mydf <- read.table(text="Country X1980       X1981       X1982       X1983       X1984       X1985
    Albania 132.9270    133.0296    133.1459    133.1868    133.2048    133.2577        
    Algeria 132.4093    132.1710    131.9649    131.7835    131.6161    131.4345        
    Andorra 140.8585    140.1076    139.3727    138.6457    137.9525    137.3192", header=TRUE, stringsAsFactors=FALSE)
    

    【讨论】:

      【解决方案3】:

      您可以使用以下方法轻松获得每年的方法

      world_means <- tbl %>% 
          select(-Country) %>% summarise_all(mean) %>%
          cbind(list(Country="World"), .)
      

      它只计算除Country 之外的所有列的平均值,然后将其与Country 绑定,我们称之为"World"。要将其添加到您的表中,只需使用rbind

      rbind(tbl, world_means)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-18
        • 2023-03-22
        • 2018-12-16
        • 2022-01-16
        • 2021-01-11
        • 2012-02-19
        • 2017-12-11
        相关资源
        最近更新 更多