如何使用pivot_longer转换纵向数据集?请求代码协助
解决pivot_longer转换纵向数据集的问题
你的数据集列名格式是「wave前缀_变量名」(比如a_sex、b_countryofbirth),要转成包含Person ID、Wave、Sex、CountryofBirth、Health的长表格式,之前的代码主要因正则匹配错误、列选择逻辑错误失效,以下是修正方案:
问题分析
- 第一段代码:正则
"(_+)"仅匹配下划线,未拆分出wave标识和变量名两部分;names_to里的_value是错误写法,应该用pivot_longer的特殊关键字.value;cols = contains("_")可能误包含个人标识符列(如果ID列带下划线的话)。 - 第二段代码:你的列名用下划线分隔,却用
contains(".")筛选列,根本选不到目标列;正则"(.+).(.+)"用点作为分隔符,和实际列名格式不符,匹配完全失效。
正确代码
假设你的个人标识符列名为PersonID,执行以下代码:
# 基础转换 InPreg_transformed <- InPregDF %>% pivot_longer( cols = -PersonID, # 排除个人标识符列,只处理wave相关列 names_to = c("Wave", ".value"), # Wave存a/b...l,.value指定保留变量名部分 names_pattern = "(.)_(.*)" # 正则拆分:单个字母(wave) + 下划线 + 变量名 ) # 可选:将变量名改成首字母大写格式 InPreg_transformed <- InPreg_transformed %>% rename( Sex = sex, CountryofBirth = countryofbirth, Health = health )
代码说明
cols = -PersonID:精准筛选要转换的列,避免误处理个人标识符。names_to = c("Wave", ".value"):Wave是新生成的列,存储a、b...l这些wave标识;.value是pivot_longer的特殊参数,用来指定把拆分后的第二部分作为新的列名(比如sex、countryofbirth)。names_pattern = "(.)_(.*)":正则分组匹配,第一组(.)捕获单个字母的wave前缀,第二组(.*)捕获下划线后的完整变量名。
如果你的个人标识符列名不是PersonID,把代码里的PersonID换成实际列名即可。
内容的提问来源于stack exchange,提问作者Sonnie Kariuki
相关产品推荐
相关产品推荐

