R语言使用tidyverse将宽格式数据还原为长格式的方法
解决方法
问题原因
你当前的pivot_longer配置没有区分列名中的「原变量名(a1/a2/a3)」和「行索引序号」两部分,导致不同变量的取值被合并到同一列,无法拆分出独立的a1、a2、a3列。
修正后的反向转换代码
你只需要调整pivot_longer的参数,将列名按下划线拆分为两部分即可:
df_long <- df_wide %>% pivot_longer(!id, names_to = c(".value", "index"), names_sep = "_" )
参数说明
names_to = c(".value", "index"):其中.value是pivot_longer的特殊关键字,表示把列名分割后的第一部分作为最终生成的列名,第二部分存入index列names_sep = "_":指定用下划线作为列名的分割符,把a1_1这类列名拆成a1和1两部分
如果需要完全还原最开始的长表格式,可以补充去空行、排序逻辑:
df_long <- df_wide %>% pivot_longer(!id, names_to = c(".value", "index"), names_sep = "_" ) %>% drop_na(starts_with("a")) %>% # 移除无对应取值的空行 arrange(id, index) %>% # 按id、索引排序,和原始表顺序一致 select(-index) # 不需要index列可直接删除
内容的提问来源于stack exchange,提问作者Moses
相关产品推荐
相关产品推荐

