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

如何统计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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:05:06