我有如下数据:
> 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
你能告诉我吗?
答案 0 :(得分:1)
基础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)
答案 1 :(得分:0)
这是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中,最好单独计算它。
要获取每年的工具,我们也可以使用“申请”,这次使用2
函数中的apply
计算下列列:
apply(df1[,2:6], 2, mean)
X1980 X1981 X1982 X1983 X1984
135.3983 135.1027 134.8278 134.5387 134.2578
答案 2 :(得分:0)
您可以使用
轻松获取每年的资金world_means <- tbl %>%
select(-Country) %>% summarise_all(mean) %>%
cbind(list(Country="World"), .)
它只计算除Country
之外的所有列的均值,然后将其与Country
绑定,我们称之为"World"
。要将其添加到您的表格,只需使用rbind
:
rbind(tbl, world_means)