【问题标题】:Creating a new data frame with calculations from an existing data frame using R使用 R 从现有数据框计算创建一个新数据框
【发布时间】:2021-03-18 20:25:49
【问题描述】:

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

【问题讨论】:

标签: r dataframe


【解决方案1】:

我们可以重塑为“长”格式并获得按“年”分组的summarised 输出

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 

或者也可以反过来做,即先得到汇总输出,然后再进行整形

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")

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多