使用gather_转换宽数据为长数据时丢失ResponseId列的问题
我看你在把DCA的宽格式数据转长格式时,遇到了ResponseId列显示异常的问题——转换后原来的响应ID没保留,反而把问题编号(Q9这类)当成了ResponseId的值,这肯定影响后续用mlogit()建模。咱们一步步来搞定这个问题:
问题根源分析
- 函数参数误用:你用的
gather_函数参数顺序搞错了,gather_的正确语法是gather_(data, key_col_name, value_col_name, gather_cols),但你把dca$ResponseId当成了第二个参数,直接导致ResponseId列被错误覆盖成了问题编号。 - 原始数据存在脏数据:你的原始数据前两行是元数据(第一行是列的说明文本,第二行是ImportId的JSON串),不是实际的用户响应记录,直接转换会把这些无效数据混进去,干扰结果。
分步解决方案
第一步:清理原始数据
先把前两行没用的元数据删掉,只保留真正的用户响应记录:
# 加载tidyr包 library(tidyr) # 清理数据:移除前两行元数据,保留实际观测 dca_clean <- dca[-c(1,2), ]
第二步:用现代函数转换长格式
gather_已经是tidyr里的旧函数了,现在推荐用更直观的pivot_longer,语法清晰不容易出错。我们指定保留ResponseId列,把Q9到Q18的列转成“问题编号”和“响应内容”两列:
# 转换为长格式 dca_long <- pivot_longer( data = dca_clean, cols = Q9:Q18, # 要转换的宽格式列范围 names_to = "QuestionId", # 原来的列名(Q9/Q10等)存入这个新列 values_to = "Response" # 原来列的响应内容存入这个新列 )
查看转换结果
现在看一下转换后的结果,ResponseId就和原始数据完全匹配了:
head(dca_long)
输出示例:
A tibble: 6 x 3ResponseId QuestionId Response
1 R_2V7lrA7n29xU0i6 Q9 Using Facebook on PC for utility
2 R_2V7lrA7n29xU0i6 Q10 Using TikTok on PC for utility
3 R_2V7lrA7n29xU0i6 Q11 Using Youtube on PC for utility
4 R_2V7lrA7n29xU0i6 Q12 Using Twitter on mobile for utility
5 R_2V7lrA7n29xU0i6 Q13 Using TikTok on Mobile for utility
6 R_2V7lrA7n29xU0i6 Q14 Using Instagram on PC for utility
这样处理后,你的`dca_long`里就保留了正确的ResponseId列,完全可以适配后续的`mlogit()`函数使用了。 内容的提问来源于stack exchange,提问作者Kushal Mohnot

