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
相关产品推荐
相关产品推荐

