R语言如何在dataframe中查找作答同一套测试的最大考生群体
解决方案
核心逻辑是直接为每一套测试生成唯一标识,完全不需要遍历所有题目组合,仅需遍历1000条考生数据即可完成计算,时间复杂度极低。
实现思路
同组考生的核心特征是作答的15道题的集合完全一致,也就是每行中非NA值的列的位置完全相同。我们只需要将每行非NA列的列名(或索引)按固定顺序拼接为唯一字符串,作为该套测试的ID,再按ID分组统计人数即可快速找到最大群体。
如果业务规则要求同组考生不仅题目相同、答案也完全一致,只需要在生成ID时把对应题目的得分也拼接进去即可。
代码实现
基于tidyverse的实现
library(dplyr) # 生成测试ID并统计各组人数 stat_result <- df %>% rowwise() %>% mutate( # 仅按题目集合分组的ID生成逻辑 test_id = paste(sort(names(select(., where(~!is.na(.))))), collapse = "_") # 如果需要同时匹配答案,用下面这行替换上面的test_id生成逻辑 # test_id = paste(sort(paste(names(select(., where(~!is.na(.)))), select(., where(~!is.na(.))), sep = "=")), collapse = "_") ) %>% ungroup() %>% count(test_id, name = "group_size", sort = TRUE) # 提取最大的同组群体 max_group <- slice_max(stat_result, group_size, n = 1)
基于base R的实现(无需安装第三方包)
# 生成每行的测试ID test_ids <- apply(df, 1, function(row) { paste(sort(names(row)[!is.na(row)]), collapse = "_") }) # 统计各组人数 stat_result <- sort(table(test_ids), decreasing = TRUE) # 提取最大的同组群体 max_group <- head(stat_result, 1)
性能说明
1000行规模的数据集,上述两种实现都可以在毫秒级完成计算,完全规避了遍历C(100,15)组合的天文级计算量。
内容的提问来源于stack exchange,提问作者Tom McDonald
相关产品推荐
相关产品推荐

