如何用一次tidyr::pivot_longer()调用实现多列宽表转长表?
用一次
tidyr::pivot_longer()就能搞定转换 完全不需要多次调用再合并,直接借助pivot_longer()的多列匹配和.value参数一步到位。
示例代码
先构造模拟的宽格式数据:
library(tidyr) library(dplyr) # 模拟宽格式数据 wide_df <- tibble( ID = c(1, 2), Genre_1 = c("Action", "Comedy"), Genre_2 = c("Drama", "Romance"), SQ1_1 = c(5, 4), SQ1_2 = c(3, 5), SQ2_1 = c(4, 3), SQ2_2 = c(5, 4) )
然后执行一次转换:
long_df <- wide_df %>% pivot_longer( cols = -ID, # 除ID外,其余列均参与转换 names_to = c(".value", "time"), # .value对应列名前缀(Genre、SQ1、SQ2),time存储后缀数字 names_pattern = "(.*)_(\\d+)" # 用正则拆分列名:捕获前缀部分和数字后缀 )
转换效果说明
得到的长格式数据会自动生成以下列:
ID:保留原ID列内容time:对应原列名中的后缀数字1/2Genre:整合Genre_1、Genre_2的对应值SQ1:整合SQ1_1、SQ1_2的评分数据SQ2:整合SQ2_1、SQ2_2的评分数据
核心逻辑是通过正则表达式拆分列名,再利用.value参数将相同前缀的列自动合并为新列,一次操作即可完成宽格式到目标长格式的转换。
内容的提问来源于stack exchange,提问作者Til Baum
相关产品推荐
相关产品推荐

