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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:10:37