You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言频率表处理:将分组列拆分为Accepted与Denied列

问题解决:将贷款数据转换为宽格式频率表

我正在使用Kaggle的Loan_Data数据集,在R云端环境中创建频率表。已经通过以下代码成功生成按purpose分组的total_n统计表格:

counts <- loan_data %>%
  group_by(purpose) %>%
  summarise(counts = n())
colnames(counts)[2]<-'total_n'    
View(counts)

接下来我想按purpose和credit.policy分组统计频次,把credit.policy的Accepted和Denied转为单独列,和total_n一起展示成宽格式表格,但尝试的代码出现错误:

counts.purpose1 %>%
  group_by(purpose) %>%
  dplyr::summarize(credit.policy = n(),
            accepted = n('Accepted'),
            denied = n('Denied'))

错误信息:

Error in dplyr::summarize():
ℹ In argument: accepted = n("Accepted").
ℹ In group 1: purpose = "all_other".
Caused by error in n():
! unused argument ("Accepted")
Run rlang::last_error() to see where the error occurred.

解决方案

不需要手动创建数据框,调整代码即可实现目标格式,以下两种方法都可行:

方法一:直接在分组汇总时计算各列

利用sum()结合逻辑判断统计符合条件的行数,一步得到宽格式结果:

counts_wide <- loan_data %>%
  group_by(purpose) %>%
  summarize(
    total_n = n(),  # 统计每个purpose的总数量
    accepted = sum(credit.policy == "Accepted"),  # 统计Accepted的数量
    denied = sum(credit.policy == "Denied")  # 统计Denied的数量
  )

方法二:先统计长格式再转宽

如果已经有长格式的分组统计结果,可以用tidyr::pivot_wider转换为宽格式,再计算总数:

# 先按purpose和credit.policy分组统计频次
counts_long <- loan_data %>%
  group_by(purpose, credit.policy) %>%
  summarize(count = n())

# 转换为宽格式,并计算总数
counts_wide <- counts_long %>%
  tidyr::pivot_wider(
    names_from = credit.policy,  # 把credit.policy的取值作为列名
    values_from = count  # 对应列的取值为统计的频次
  ) %>%
  mutate(total_n = Accepted + Denied)  # 计算每个purpose的总数量

错误原因说明

之前的代码错误在于使用n('Accepted'),dplyr中的n()函数仅用于统计当前分组的总行数,不能传入参数。要统计符合特定条件的行数,需要用sum()配合逻辑表达式(如credit.policy == "Accepted"),逻辑表达式会返回布尔值,sum()会将TRUE视为1、FALSE视为0,从而得到符合条件的行数。

内容的提问来源于stack exchange,提问作者user16517349

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:53:12