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

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, ]

代码说明

  1. 自定义函数get_top_answer:
    • 先过滤掉该行的NA值,只处理有效回答
    • 计算频率表后,判断是否有多个回答共享最高频率,是则返回NA;否则计算占比并返回结果
  2. apply逐行处理:用t()转置结果矩阵,确保每行对应原数据的一行
  3. 合并与筛选:将结果合并到原数据框后,直接筛选Perc > 0.7的行即可

运行上述代码后,filtered_output就是符合要求的高共识度问题结果。

内容的提问来源于stack exchange,提问作者Hamadryas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:05:27