R语言:按行查找最频繁字符串及其占比并筛选高共识结果
按行提取高频回答并筛选高共识度结果
需求说明
我有一个data.frame(命名为dat),每行对应一个问题,最多7列存储回答内容,其中包含少量NA值。需要完成以下操作:
- 按行找出出现最频繁的回答,若存在多个回答频率相同且为最高值,返回NA
- 计算该高频回答的占比(以排除NA后的有效回答总数为分母)
- 最终筛选出回答共识度(占比)>70%的问题及对应结果
示例数据
dat <- data.frame(rbind( A=c("Dog", "Dog", "Cat", "Dog","Dog", "Dog", "Cat"), B=c("Dog", "Cat", "Cat", "Cat", "Cat", "Cat", "Cat"), C=c("Cat", "Fox", "Fox", "Fish", "Dog", "Mouse", "Rat"), D=c("Mouse", "Mouse", "Mouse", "Mouse", "Mouse", "Mouse", "Mouse"), E=c("Pigeon", "Pigeon", "Seagull", "Pigeon", "Seagull", "Seagull", "Pigeon"), G=c("Fox", "Fox", "Fox", NA, "Dog", "Dog", "Dog") ), stringsAsFactors = FALSE)
现有尝试
我尝试用which.max()查找每行最常见的字符串,但无法处理平局情况,也没计算占比:
dat$answer <- apply(dat,1,function(x) names(which.max(table(x))))
期望输出
最终希望得到包含原回答列、高频回答、占比的结果,并能筛选出共识度>0.7的行,示例格式如下:
output <- data.frame( dat[, 1:7], Answer = c("Dog", "Cat", "Fox", "Mouse", "Pigeon", NA), Perc = c(0.71, 0.86, 0.28, 1, 0.57, NA) ) colnames(output) <- c("X1", "X2", "X3", "X4", "X5", "X6", "X7", "Answer", "Perc")
实现方案
可以通过自定义函数结合apply完成需求,具体代码如下:
# 自定义处理每行的函数 get_top_answer <- function(row) { # 去掉NA值,保留有效回答 valid_ans <- na.omit(row) # 如果全是NA,直接返回NA if (length(valid_ans) == 0) { return(c(NA, NA)) } # 计算每个回答的频率 freq_table <- table(valid_ans) # 找到最高频率值 max_freq <- max(freq_table) # 统计有多少个回答达到最高频率 top_ans <- names(freq_table[freq_table == max_freq]) # 处理平局情况 if (length(top_ans) > 1) { return(c(NA, NA)) } else { # 计算占比,保留两位小数 perc <- round(max_freq / length(valid_ans), 2) return(c(top_ans, perc)) } } # 逐行应用函数,得到结果矩阵 result_matrix <- t(apply(dat, 1, get_top_answer)) # 转换为数据框,并合并到原数据 output <- cbind(dat, Answer = result_matrix[, 1], Perc = as.numeric(result_matrix[, 2])) # 重命名列(统一为X1-X7格式) colnames(output)[1:7] <- paste0("X", 1:7) # 筛选共识度>70%的结果 filtered_output <- output[output$Perc > 0.7, ]
代码说明
- 自定义函数
get_top_answer:- 先过滤掉该行的NA值,只处理有效回答
- 计算频率表后,判断是否有多个回答共享最高频率,是则返回NA;否则计算占比并返回结果
apply逐行处理:用t()转置结果矩阵,确保每行对应原数据的一行- 合并与筛选:将结果合并到原数据框后,直接筛选
Perc > 0.7的行即可
运行上述代码后,filtered_output就是符合要求的高共识度问题结果。
内容的提问来源于stack exchange,提问作者Hamadryas
相关产品推荐
相关产品推荐

