我希望根据人口数据框架创建一个新的平均值数据框架。 A 列是年龄列表,后面是各个年份的人口数量。我想知道创建具有每年平均年龄的新数据框的最佳方法是什么。我用来计算平均值的公式是 sum(age*year)/sum(year)
例如,这就是我所拥有的:
Age | 2000 | 2001 | 2002
------------------------
2 | 4 | 1 | 2
3 | 6 | 3 | 5
4 | 10 | 9 | 8
我想要一个像这样的新数据框:
Year| Avg_age
--------------
2000 | 3.3
2001 | 3.6
2002 | 3.4
最佳答案
我们可以重新调整为“长”格式并获取按“年份”分组的总结
d输出
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = -Age, names_to = 'Year') %>%
group_by(Year) %>%
summarise(Avg_age = sum(Age * value)/sum(value), .groups = 'drop')
-输出
# A tibble: 3 x 2
# Year Avg_age
#* <chr> <dbl>
#1 2000 3.3
#2 2001 3.62
#3 2002 3.4
或者也可以反向完成,即首先获取汇总输出,然后进行 reshape
df1 %>%
summarise(across(-Age, ~ sum(Age * .)/sum(.))) %>%
pivot_longer(cols = everything(), names_to = 'Year',
values_to = 'Avg_age')
# A tibble: 3 x 2
# Year Avg_age
# <chr> <dbl>
#1 2000 3.3
#2 2001 3.62
#3 2002 3.4
或者将dapply
与stack
结合使用
library(collapse)
stack(dapply(df1[-1], function(x) sum(x * df1$Age)/sum(x)))[2:1]
数据
df1 <- structure(list(Age = 2:4, `2000` = c(4, 6, 10), `2001` = c(1,
3, 9), `2002` = c(2, 5, 8)), row.names = c(NA, -3L), class = "data.frame")
关于r - 使用 R 根据现有数据框进行计算创建新数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66698634/