How to get the means of all columns but one?

我只是一个虾纸丫 提交于 2019-12-13 09:26:35

问题


I have a data like below :

> 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    

I want to get mean of values for each year for all countries and add a row like World to the end of the dataframe, so that I can plot the change of the mean value through years, in that format.

I tried using gather() so that I have a data with three columns only, like Country-year-value. However I can not think of a way to calculate the mean for the world.

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

Can you please advise?


回答1:


A possible solution with base R:

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

which gives:

  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

And a tidyverse solution:

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

with a long format outcome:

   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

Used data:

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)



回答2:


This is a great use case for apply, no transformations from your original format necessary:

1 means to calculate across rows, and we select columns 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

You don't really want to add a summary row to your primary table, that's how you might do it in Excel, but in R it's better practice to calculate it separately.

To get the means for each year, we can also use apply, this time using 2 in the apply function to calculate down columns:

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


   X1980    X1981    X1982    X1983    X1984 
135.3983 135.1027 134.8278 134.5387 134.2578 



回答3:


You can easily get the means for each year using

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

It just computes the mean for all columns except Country and then binds that with a Country we call "World". To add it to your table, simply use rbind:

rbind(tbl, world_means)


来源:https://stackoverflow.com/questions/49389204/how-to-get-the-means-of-all-columns-but-one

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!