r - 使用 R 根据现有数据框进行计算创建新数据框

标签 r dataframe

我希望根据人口数据框架创建一个新的平均值数据框架。 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 

或者将dapplystack结合使用

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/

相关文章:

R:使用数据表重新排序因子级别(与 Plotly 一起使用)

r - 空白字符串不能用R中的NA替换

r - 为 TRUE 值定义一个 "buffer",如果在 "buffer"内,则将 TRUE 转换为 FALSE

r - 如何隐藏来自pander()的消息?

r - 获取 R 中非数值的 2 个矩阵或数据框之间的差异

根据三列删除重复行

python - 为什么我创建的函数出现 TypeError : f() takes 0 positional arguments but 1 was given

python - 如何有条件地将子字符串复制到 Pandas 数据框的新列中?

python - 在 Pandas 中将一个数据帧中的行转置为另一个数据帧中的列的最佳方法?

python - 如何在 Pandas 数据框中添加坐标数组作为行