如何统计R数据框中每行含指定值组合的行数?求更优解法
统计数据框中包含指定值组合的行数(优雅解决方案)
首先修正你提供的数据框代码(原代码列名重复,R会自动重命名,这里改为col1-col5方便操作):
df = data.frame(col1 = c("value_1","value_3","value_3","value_2"), col2 = c("value_1","value_1","value_4","value_2"), col3 = c("value_1","value_2","value_1","value_2"), col4 = c("value_3","value_3","value_3","value_2"), col5 = c("value_2","value_3","value_4","value_2"))
指定值组合:
comb = c("value_1","value_2")
需求是统计每行至少包含组合中所有值一次的行数,期望输出为2。以下是几种比循环生成哑变量更优雅的实现方式:
1. 基础R:apply + all + %in%
这是最直观的基础R写法,直接遍历每行判断组合完整性:
sum(apply(df, 1, function(row) all(comb %in% row))) # 输出:2
逻辑:apply(df, 1, ...)按行遍历数据框,all(comb %in% row)检查组合里的每个值是否都存在于当前行,最后sum把符合条件的TRUE(自动转为1)累加得到总数。
2. Tidyverse风格:dplyr行级操作
如果你习惯用tidyverse工具链,用rowwise实现行级判断:
library(dplyr) df %>% rowwise() %>% mutate(has_all = all(comb %in% c_across(everything()))) %>% pull(has_all) %>% sum() # 输出:2
逻辑:rowwise()指定按行处理,c_across(everything())提取当前行所有列的值,判断组合是否全包含后,提取结果求和。
3. 向量化操作(高效适配大数据集)
避免循环,用向量化运算提升效率,尤其适合行数很多的数据集:
sum(colSums(sapply(comb, function(x) rowSums(df == x) > 0)) == length(comb)) # 输出:2
逻辑:
sapply(comb, function(x) rowSums(df == x) > 0)生成一个逻辑矩阵,每列对应组合中的一个值,每行标记该行是否包含该值;colSums统计每行符合的组合值数量,等于组合长度的行就是满足条件的行,最后sum统计总数。
内容的提问来源于stack exchange,提问作者yacx
相关产品推荐
相关产品推荐

