如何统计数据框中各值至少出现一次的行数(R语言)
解决方案
Base R 实现
核心思路:先逐行判定每个值是否存在,再统计每个值覆盖的行数,全程用向量化操作避免低效循环。
# 原始数据框 df <- data.frame(col1 = c("value_1", "value_2", "value_3"), col2 = c("value_2", "value_2", "value_4"), col3 = c("value_1", "value_3", "value_3") ) # 提取所有唯一值 all_values <- unique(unlist(df)) # 逐行检查每个值的存在性,统计总行数 count_result <- colSums(sapply(all_values, function(x) apply(df, 1, function(row) x %in% row))) # 转换为目标数据框格式 df_out_base <- as.data.frame(t(count_result))
运行后得到的结果:
> df_out_base value_1 value_2 value_3 value_4 1 1 2 2 1
Tidyverse 实现
核心思路:通过数据格式转换,用分组去重确保每行仅统计一次,再高效聚合计数。
library(tidyverse) # 原始数据框 df <- data.frame(col1 = c("value_1", "value_2", "value_3"), col2 = c("value_2", "value_2", "value_4"), col3 = c("value_1", "value_3", "value_3") ) df_out_tidy <- df %>% # 添加行号用于分组标记 mutate(row_id = row_number()) %>% # 宽格式转长格式,统一值的存储结构 pivot_longer(-row_id, names_to = "col", values_to = "value") %>% # 按行+值去重,避免同一行的重复值多次计数 distinct(row_id, value) %>% # 统计每个值对应的行数 count(value) %>% # 长格式转回宽格式,匹配目标输出结构 pivot_wider(names_from = value, values_from = n, values_fill = 0) %>% # 转换为标准数据框 as.data.frame()
运行后得到的结果:
> df_out_tidy value_1 value_2 value_3 value_4 1 1 2 2 1
两种方法均采用向量化/批量操作逻辑,避免了ifelse()这类低效的分支判断,适合处理大规模数据场景。
内容的提问来源于stack exchange,提问作者yacx
相关产品推荐
相关产品推荐

