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 inn():
! unused argument ("Accepted")
Runrlang::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

