R语言distinct搭配summarise报错:找不到age对象
解决“统计唯一账户年龄时找不到age对象”的问题
数据示例
ACCOUNT = c("M205109", "M205109", "M201212", "M205668", "M207954", "M208966", "M203465", "M207622", "M201869", "M201869") age = c(20, 20, 18, 29, 21, 19, 19, 23, 22, 22) data <- data.frame(ACCOUNT, age)
报错原因
distinct(ACCOUNT)执行后,数据框仅保留ACCOUNT列,后续summarise调用age时自然找不到该列。你的需求是基于唯一账户做年龄统计,必须保留age列的同时完成账户去重。
解决方案
方案1:指定distinct保留需要的列
如果同一账户的age值完全一致,直接在distinct中指定要保留的列,启用.keep_all参数保留其他列:
library(tidyverse) age_summary_all <- data %>% distinct(ACCOUNT, age, .keep_all = TRUE) %>% summarise( min = min(age, na.rm = TRUE), q1 = quantile(age, 0.25, na.rm = TRUE), median = median(age, na.rm = TRUE), mean = mean(age, na.rm = TRUE), q3 = quantile(age, 0.75, na.rm = TRUE), max = max(age, na.rm = TRUE) )
方案2:分组后取唯一账户的年龄
如果存在同一账户对应不同age值的情况(示例中未体现),先按ACCOUNT分组,取每组的一个age值(比如第一条记录的age),再做统计:
age_summary_all <- data %>% group_by(ACCOUNT) %>% slice_head(n = 1) %>% # 取每组第一条记录的age ungroup() %>% summarise( min = min(age, na.rm = TRUE), q1 = quantile(age, 0.25, na.rm = TRUE), median = median(age, na.rm = TRUE), mean = mean(age, na.rm = TRUE), q3 = quantile(age, 0.75, na.rm = TRUE), max = max(age, na.rm = TRUE) )
也可以在分组时直接确定每个账户的唯一age值(比如取最小/最大值,假设同一账户age一致):
age_summary_all <- data %>% group_by(ACCOUNT) %>% summarise(age = first(age)) %>% # 用min(age)/max(age)结果一致 ungroup() %>% summarise( min = min(age, na.rm = TRUE), q1 = quantile(age, 0.25, na.rm = TRUE), median = median(age, na.rm = TRUE), mean = mean(age, na.rm = TRUE), q3 = quantile(age, 0.75, na.rm = TRUE), max = max(age, na.rm = TRUE) )
结果验证
执行上述任意方案后,统计的样本量会是8(对应8个唯一账户),所有统计指标均可正常计算。
内容的提问来源于stack exchange,提问作者Pendragon
相关产品推荐
相关产品推荐

