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行),这就是重复的原因。
如果是按行统计的需求(两种常见场景)
如果你其实是想统计每行的类别情况,这里给你两种常见需求的解决方案:
- 统计每行非NA值的总个数
用rowSums()比apply更高效:
row_non_na_counts <- rowSums(!is.na(data)) print(row_non_na_counts) # 输出:2 3 0 3 2
- 统计每行去重后的非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
相关产品推荐
相关产品推荐

