如何使用pivot_longer将指定宽格式数据转为目标长格式?
数据转换:宽格式转长格式(
pivot_longer正确用法) 原始数据集
df1 <- structure(list(idpat = c("1", "2", "2", "1", "1"), idA = c("100a", "100b", "100c", "100b", "100a"), redA = c(1, 0, 1, 0, 1), idB = c("200a", "200b", "200a", "200b", "200a"), redB = c(0, 1, 1, 1, 0)), class = "data.frame", row.names = c(NA, -5L))
输出预览:
idpat idA redA idB redB 1 1 100a 1 200a 0 2 2 100b 0 200b 1 3 2 100c 1 200a 1 4 1 100b 0 200b 1 5 1 100a 1 200a 0
目标长格式数据集
target_df <- structure(list(idpat = c(1, 1, 2, 2, 2, 2, 1, 1, 1, 1), id = c("100a", "200a", "100b", "200b", "100c", "200a", "100b", "200b", "100a", "200a"), red = c(1, 0, 0, 1, 1, 1, 0, 1, 1, 0)), class = "data.frame", row.names = c(NA, -10L))
输出预览:
idpat id red 1 1 100a 1 2 1 200a 0 3 2 100b 0 4 2 200b 1 5 2 100c 1 6 2 200a 1 7 1 100b 0 8 1 200b 1 9 1 100a 1 10 1 200a 0
错误代码分析
你之前的代码问题在于:
- 错误将
idpat纳入了需要拉长的列,而idpat是需要保留的分组标识,不应被转换 - 未正确匹配
idA/idB与对应redA/redB的成对关系,这两组列是关联变量,需要按组转换
正确解决方案
使用pivot_longer时,需通过正则表达式匹配成对列的前缀与后缀,实现关联转换:
library(tidyr) result_df <- df1 %>% pivot_longer( cols = -idpat, # 排除不需要拉长的idpat列 names_to = c(".value", "group"), # .value保留前缀作为新列名,group暂存后缀 names_pattern = "(id|red)(A|B)" # 正则捕获列名的两部分:前缀(id/red)、后缀(A/B) ) %>% select(-group) %>% # 删除临时的group列 mutate(idpat = as.integer(idpat)) # 转换idpat为整数类型,匹配目标格式
代码说明
cols = -idpat:仅对idA/redA/idB/redB列执行拉长操作names_to = c(".value", "group"):.value是特殊标识符,会将匹配到的id/red作为新列名,自动填充对应值group临时存储列名后缀A/B,后续可删除
names_pattern = "(id|red)(A|B)":用正则表达式拆分列名,确保idA与redA、idB与redB对应转换mutate(idpat = as.integer(idpat)):将idpat从字符型转为整数型,与目标数据集格式完全一致
运行后即可得到与预期完全匹配的长格式数据集。
内容的提问来源于stack exchange,提问作者user3483060
相关产品推荐
相关产品推荐

