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

R语言如何统计数据框各列排除NA值的唯一值个数

R语言统计数据框每列排除NA的唯一值数量

问题场景

给定可复现的数据框,需要统计每一列不包含缺失(NA)值的唯一值数量。下方提供的原有代码会将NA值纳入统计,导致nat_country列的唯一值计数在n_unique_values结果中显示为4(正确结果应为3)。Python中pandas提供的nunique()函数可自动排除NA值完成统计,R语言中可通过以下方法实现相同效果。

原有问题复现代码

nat_country = c("United-States", "Germany", "United-States", "United-States", "United-States", "United-States", "Taiwan", NA)
age = c(14,15,45,78,96,58,25,36)
dat = data.frame(nat_country, age)
# 原有错误写法:会把NA单独计为一个唯一值
n_unique_values  = t(data.frame(apply(dat, 2, function(x) length(unique(x)))))

实现方案

1. Base R 原生无依赖实现

不需要安装第三方包,只需要在统计前过滤掉列中的NA值即可,修正原有apply逻辑:

n_unique_values <- t(data.frame(apply(dat, 2, function(x) {
  # 先剔除NA值再统计唯一值长度
  length(unique(x[!is.na(x)]))
})))

如果要避免apply强制将数据框转为矩阵带来的隐式类型转换问题,推荐用向量化的vapply写法,运行效率更高也更稳定:

n_unique_values <- vapply(
  dat, 
  function(x) length(unique(x[!is.na(x)])), 
  FUN.VALUE = integer(1)
)

2. dplyr实现(与pandas nunique()逻辑对齐)

如果使用tidyverse生态,dplyr包提供的n_distinct()函数和Python pandas的nunique()逻辑完全一致,设置参数na.rm = TRUE即可自动排除NA值统计:

library(dplyr)

# 逐列统计返回命名向量
n_unique_values <- vapply(
  dat, 
  function(x) n_distinct(x, na.rm = TRUE), 
  FUN.VALUE = integer(1)
)

# 直接整表统计返回数据框格式结果
n_unique_tbl <- dat %>%
  summarise(across(everything(), ~n_distinct(.x, na.rm = TRUE)))

运行以上任意修正后的代码,nat_country列的唯一值计数都会返回正确结果3,无缺失值的age列返回计数8。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 00:04:10