R语言处理开放题编码数据:合并向量生成计数变量实现高频类目统计
R语言多编码统计解决方案
现有操作问题说明
你之前第二步移除逗号的操作是问题核心:逗号本身是编码的分隔符,删除后1,12会变成连续字符串112,自然匹配编码1时会误命中包含1的其他编码。不需要删除逗号,反而要保留分隔符做精准匹配。
实现步骤
步骤1:修正编码合并逻辑
按行合并所有编码列,保留逗号作为分隔符,同时处理空值/NA:
# 合并第一波所有编码列,保留分隔符 df$allcodes_w1 <- apply(df[, paste0("Code_1_", 1:6)], 1, function(x) { # 移除空值和NA后拼接 x_clean <- na.omit(x[x != ""]) paste(x_clean, collapse = ",") })
合并后每行格式为1,12,13这类标准分隔格式。
步骤2:批量生成49个编码频次变量
用精准正则匹配独立编码,避免误匹配,同时统计每个编码的提及次数:
# 批量生成1-49编码对应的频次变量 for (code in 1:49) { # 正则规则:编码前后只能是字符串开头/结尾、或者分隔符逗号 pattern <- paste0("(^|,)", code, "(,|$)") # 统计当前编码在该行的匹配次数 match_count <- lengths(gregexpr(pattern, df$allcodes_w1)) # 无匹配时gregexpr返回-1,对应次数修正为0 match_count[match_count < 0] <- 0 # 生成对应变量 df[[paste0("var", code)]] <- match_count }
生成的var1到var49的值直接对应每个受访者该编码的提及次数,完全符合2=提2次、1=提1次、0=未提及的要求。
步骤3:统计编码总提及次数,输出前5类目
# 计算所有编码的总提及次数 code_total <- colSums(df[, paste0("var", 1:49)]) # 转换为易读的数据框 code_stat <- data.frame( 编码 = as.integer(gsub("var", "", names(code_total))), 总提及次数 = as.numeric(code_total) ) # 按提及次数降序排序,取前5 top5_code <- head(code_stat[order(-code_stat$总提及次数), ], 5) print(top5_code)
内容的提问来源于stack exchange,提问作者Marloes
相关产品推荐
相关产品推荐

