如何使用 R 对数据框中的多列进行分组并执行聚合函数

数据挖掘 r 数据集 聚合
2021-10-11 09:05:23

我有一个数据框,其列定义如下。我提供了一组示例,与此类似,我有许多国家的贷款金额和性别变量

      country          loan_amount          gender 
1      Austia              175                F        
2      Austia              100                F        
3      Austia              825                M        
4      Austia              175                F        
5      Austia             1025                M        
6      Austia              225                F        

在这里我需要按国家分组,然后对于每个国家,我需要在新列中按性别计算贷款百分比,以便新列将具有该国家/地区总贷款金额的男性百分比和该国家/地区总贷款金额的女性百分比. 我需要做两个 group_by 函数,首先将所有国家/地区分组在一起,然后将性别分组以计算贷款百分比。

    Total loan amount = 2525
     female_prcent = 175+100+175+225/2525 = 26.73
     male_percent = 825+1025/2525 = 73.26

输出应如下所示:

      country            female_percent   male_percent 
1      Austia              26.73            73.26        

我正在尝试在 R 中执行此操作。我尝试了以下函数,但我的 R 会话没有产生任何结果并且它正在终止。

  df %>%
  group_by(country, gender) %>%
  summarise_each(funs(sum))

有人可以帮我实现这个输出吗?我认为这可以使用 dplyr 函数来实现,但我在两者之间感到震惊。

3个回答
library(dplyr)
library(tidyr)     
df %>% group_by(country, gender) %>% 
       summarise(total_loan_amount =sum(loan_amount)) %>% 
       spread(gender, total_loan_amount) %>% 
       ungroup() %>%
       transmute(country = country,  female_percent = F / (F+M), male_percent = M /(F+M))

结果是

 Source: local data frame [1 x 3]

      country female_percent male_percent
       (fctr)          (dbl)        (dbl)
    1  Austia      0.2673267    0.7326733

我相信有更好的方法来做到这一点。下面是我的简单介绍。

library(dplyr); library(reshape2)
Summary <- df %>%
  group_by(country, gender) %>%
  summarise(Net = sum(loan_amount))

  final <- recast(Summary, country~gender, id.var = c("country", "gender"))
  final <- mutate(final, F_percent = final$F/(final$F+final$M), M_percent = final$M/(final$F+final$M) )

用更好的名称命名列并保留或删除某些列现在应该很容易。

我知道这是一篇旧帖子,但只是想我会分享我的解决方案,我认为它有点干净。

library(tidyverse)

df  <- data.frame(stringsAsFactors=FALSE,
       country = c("Austia", "Austia", "Austia", "Austia", "Austia", "Austia"),
   loan_amount = c(175, 100, 825, 175, 1025, 225),
        gender = c("F", "F", "M", "F", "M", "F")
)

df %>%
  group_by(country)  %>%
  summarize(female_percent = sum(loan_amount[gender=="F"]) / sum(loan_amount),
            male_percent = 1-female_percent)