如何用R语言检测调研数据单条行内的重复值?
嘿,这个需求太贴合问卷数据清洗的场景了——检测敷衍/随机作答对吧?针对你的EPFL社区调研数据集(1797行、23个1-5量表的环保行为问题),我给你几个实用的R方案,一步步帮你按行提取重复值并识别可疑作答:
方案1:基础R快速统计每行重复值频率
如果习惯用基础R语法,这个方法高效直接,能快速拿到每行最常出现的数值及次数:
# 先定义要分析的23个环保行为变量列(假设第2-24列是行为问题,第1列是受访者ID) behavior_cols <- 2:24 # 按行计算重复值统计:最频繁的数值、出现次数、总问题数 row_dupe_stats <- t(apply(epfl_data[, behavior_cols], 1, function(row) { freq_table <- table(row) max_repeat_count <- max(freq_table) most_common_val <- names(freq_table)[which.max(freq_table)] c(most_common_value = most_common_val, max_repeats = max_repeat_count, total_questions = length(row)) })) # 转成数据框方便后续合并或筛选 row_dupe_stats <- as.data.frame(row_dupe_stats, stringsAsFactors = FALSE) row_dupe_stats$max_repeats <- as.integer(row_dupe_stats$max_repeats) row_dupe_stats$total_questions <- as.integer(row_dupe_stats$total_questions) # 可以和原数据集合并查看 epfl_data <- cbind(epfl_data, row_dupe_stats)
比如你想找所有超过15个相同答案的行,直接filter(epfl_data, max_repeats > 15)就行。
方案2:用tidyverse做灵活的行级分析
如果需要更灵活的分组、筛选或可视化,用dplyr+tidyr的长格式处理更顺手:
library(dplyr) library(tidyr) # 先给每行加唯一标识(如果数据集没有受访者ID的话) epfl_data <- epfl_data %>% mutate(respondent_id = row_number()) # 转成长格式,按受访者分组统计每个答案的出现次数 row_dupe_tidy <- epfl_data %>% pivot_longer(cols = all_of(behavior_cols), names_to = "question", values_to = "response") %>% group_by(respondent_id, response) %>% tally(name = "repeat_count") %>% arrange(respondent_id, desc(repeat_count)) %>% slice(1) # 保留每个受访者出现次数最多的答案 # 和原数据集合并,方便查看每个受访者的重复情况 epfl_data_with_stats <- epfl_data %>% left_join(row_dupe_tidy, by = "respondent_id")
额外技巧:精准检测全选"3"的可疑作答
如果重点关注大量选"3"的随机行为,可以直接统计每行中"3"的出现次数:
# 统计每行中"3"的数量 epfl_data$count_3 <- apply(epfl_data[, behavior_cols], 1, function(row) sum(row == 3)) # 筛选出超过20个"3"的可疑行(可根据需求调整阈值) suspect_random_rows <- epfl_data %>% filter(count_3 > 20)
辅助判断:用行内标准差识别集中作答
另一个判断随机作答的小技巧:计算每行答案的标准差,标准差越小说明答案越集中(比如全选同一个值):
epfl_data$row_response_sd <- apply(epfl_data[, behavior_cols], 1, sd) # 标准差接近0的行,大概率是敷衍作答 highly_suspect <- epfl_data %>% filter(row_response_sd < 0.5)
内容的提问来源于stack exchange,提问作者Mehdi Tarik
相关产品推荐
相关产品推荐

