在R中实现含NA值的多变量宽表转长表求助
解决方案:使用pivot_longer转换宽格式为长格式
你可以用tidyr包中的pivot_longer函数,通过正则表达式匹配变量名的规律,批量合并多组id和score变量,同时保留NA值。具体代码如下:
# 加载tidyr包 library(tidyr) # 转换格式 want <- have %>% pivot_longer( cols = -primary_id, # 排除主键列,转换其余所有列 names_pattern = "(id|score)(\\d+)", # 拆分变量名为前缀(id/score)和数字后缀 names_to = c(".value", "group"), # .value用于合并同前缀的列,group暂存数字后缀 values_drop_na = FALSE # 保留NA值,默认即为FALSE,可省略 ) %>% select(primary_id, ids = id, scores = score) # 重命名列并移除临时的group列
代码说明:
names_pattern = "(id|score)(\\d+)":正则表达式精准匹配id1/score1、id2/score2这类变量名,将其拆分为「前缀(id或score)」和「数字后缀」两部分。names_to = c(".value", "group"):.value会把所有前缀相同的列合并成一列(比如所有id开头的列合并为id列,score开头的列合并为score列),group用来确保每组idN和scoreN对应匹配。- 最后通过
select调整列名和顺序,得到你需要的格式。
运行上述代码后,即可得到包含所有NA值的长格式数据集,且完全适配你实际的20组id/score变量。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

