使用R tidyverse与ggplot开展分组描述性统计相关问题求助
问题解答
一、分组统计报错原因与修复方案
报错原因
- dplyr管道操作中错误使用
df$引用列:管道传入的是分组后的子集数据,df$Collected会直接调用原全量数据集的列,导致所有分组的求和结果都是全量Collected的总和,最终df_tidy只有1行有效数据 na.rm参数位置错误:你把它放在了summarise()的参数位,正确应该放在sum()函数内部,用来忽略求和时的NA值- ggplot映射长度不匹配:你在ggplot的aes中写
x = df$Gender,调用的是原数据十几万行的Gender列,但df_tidy只有2行(男女两个分组),长度不一致直接触发美学映射报错
修复代码
library(tidyverse) # 统计不同性别Collected总和 df_tidy <- df %>% drop_na(Gender) %>% # 先去掉性别为NA的观测 group_by(Gender) %>% summarise(sum_collected = sum(Collected, na.rm = TRUE)) # 输出你需要的统计结果表 print(df_tidy) # 绘制柱状图 ggplot(df_tidy, aes(x = Gender, y = sum_collected)) + geom_col()
二、Freq与Provided相关性绘图优化
异常原因
你添加的geom_line()默认会按数据行的顺序把所有散点连起来,导致图面杂乱,无法看出两个变量的趋势关系。
优化代码
如果要探究两个变量的相关性,保留散点+趋势拟合线即可:
df %>% drop_na(Freq, Provided) %>% # 去掉两个变量为NA的观测 ggplot(aes(x = Freq, y = Provided)) + geom_point(alpha = 0.3) + # alpha调整透明度避免点重叠看不清 geom_smooth(method = "lm", se = TRUE) # 添加线性拟合线和95%置信区间
三、验证Freq>10时Provided的出现频率更高的实现方案
首先将Freq按是否大于10分组,再做描述统计和显著性检验即可:
df_freq <- df %>% drop_na(Freq) %>% mutate(freq_group = ifelse(Freq > 10, "Freq>10", "Freq≤10")) # 1. 描述统计:查看两组Provided的非NA占比、均值、中位数等指标 df_freq_stat <- df_freq %>% group_by(freq_group) %>% summarise( sample_num = n(), provided_non_na_rate = mean(!is.na(Provided)), provided_mean = mean(Provided, na.rm = TRUE), provided_median = median(Provided, na.rm = TRUE) ) print(df_freq_stat) # 2. 显著性检验:如果是比较两组Provided的均值差异,用t检验 t_test_res <- t.test(Provided ~ freq_group, data = df_freq) print(t_test_res) # 3. 如果是比较Provided大于某阈值的比例差异,用卡方检验 # 示例:比较两组Provided>20的比例差异 df_freq <- df_freq %>% filter(!is.na(Provided)) %>% mutate(provided_high = ifelse(Provided > 20, "高值", "低值")) chisq_test_res <- chisq.test(table(df_freq$freq_group, df_freq$provided_high)) print(chisq_test_res)
内容的提问来源于stack exchange,提问作者Cryena
相关产品推荐
相关产品推荐

