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

R语言如何简洁从现有数据框生成唯一值计数统计数据框

简洁实现方案

完全不需要重复写3行结构一致的计算代码,借助dplyr的跨列计算函数搭配tidyr的长宽表转换函数,就能一步生成你需要的结构化结果,逻辑更紧凑也更易后续维护。

推荐写法(完全匹配目标输出)

直接在跨列计算时指定好统计项的命名,计算完成后一键转成要求的两列结构:

library(dplyr)
library(tidyr)

stat_df <- mpg %>%
  summarise(
    across(
      # 直接映射统计项名和对应要计算的原字段
      .cols = c(n_manu = manufacturer, n_model = model, n_year = year),
      .fns = n_distinct
    )
  ) %>%
  # 宽表转长表,直接得到stat、value两列
  pivot_longer(
    cols = everything(),
    names_to = "stat",
    values_to = "value"
  )

运行后得到的stat_df和你给出的目标结构、数值完全一致:

# A tibble: 3 × 2
  stat    value
  <chr>   <int>
1 n_manu     15
2 n_model    38
3 n_year      2

写法优势

  • 没有重复逻辑,后续如果要新增其他字段的唯一值统计,只需要在.cols参数里追加键值对即可,不需要复制整段计算代码
  • 逻辑更严谨:你原写法中select(列) %>% n_distinct()的写法本质是对选中的数据框计算行级唯一值,刚好仅选单列时结果和单字段去重计数一致,如果不小心选了多列会得到多列组合的去重数,和单字段统计的预期不符;用across是对每一列单独应用n_distinct,不会出现这类隐性错误。

如果不想加载tidyr,也可以直接用基础R的列表拼接后转数据框,但上面的tidyverse写法可读性最高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:36:24