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

R语言apply正确使用:合并列后统计数据框类别变量数量

解决R中合并数据框行后统计类别变量数量的重复结果问题

看起来你是想把数据框里的所有类别变量(去掉NA)合并后统计每个类别的总数,但用apply的时候不小心让结果重复了五次——这大概率是因为你在apply的函数里,每次都统计了整个数据框的类别,而不是处理当前行后再汇总对吧?

先看你的示例数据:

a <- c('car','bike',NA,'moto','skate')
b <- c(NA,'car',NA,NA,'bike')
c <- c('car',NA,NA,'skate',NA)
d <- c('moto','skate',NA,'car',NA)
data <- data.frame(a,b,c,d)

核心需求:统计全局类别总数

其实根本不需要用apply按行处理,直接把整个数据框扁平化(转成向量),去掉NA后用table()统计就行,简单高效:

# 把数据框转成一维向量,同时过滤掉NA
all_valid_vals <- na.omit(unlist(data))
# 统计每个类别的出现次数
category_counts <- table(all_valid_vals)

# 输出结果
print(category_counts)

运行后会得到:

all_valid_vals
   bike    car   moto   skate 
      2      3      2      3 

为什么你的apply会得到重复五次的结果?

如果你之前的代码类似这样:

x <- vector('list', length = nrow(data))
x <- apply(data, 1, function(y) {
  # 这里错误地用了整个data,而不是当前行y
  all_vals <- na.omit(unlist(data))
  table(all_vals)
})

那每次按行循环时,你都在统计整个数据框的类别,所以会返回5个完全相同的结果(正好对应数据框的5行),这就是重复的原因。

如果是按行统计的需求(两种常见场景)

如果你其实是想统计每行的类别情况,这里给你两种常见需求的解决方案:

  1. 统计每行非NA值的总个数
    用rowSums()比apply更高效:
row_non_na_counts <- rowSums(!is.na(data))
print(row_non_na_counts)
# 输出:2 3 0 3 2
  1. 统计每行去重后的非NA类别个数
    比如第一行的非NA值是car, car, moto,去重后是2个类别:
row_unique_category_counts <- apply(data, 1, function(row) {
  # 去掉NA后去重,再统计长度
  length(unique(na.omit(row)))
})
print(row_unique_category_counts)
# 输出:2 3 0 3 2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:53:36