如何用tidyr包的pivot_longer()函数在R中重塑指定数据框?
使用tidyr::pivot_longer()重塑数据框
原始数据
你有一个1行12列的数据框:
df <- data.frame(q_q10=0,q_q20=0, q_q30=0,q_q40=400, q_q10_low=0,q_q20_low=0,q_q30_low=0,q_q40_low=350, q_q10_up=24,q_q20_up=24,q_q30_up=24,q_q40_up=500)
目标数据
希望将其转换为4行3列的结构,包含quantile、low、up三个变量:
data.frame(quantile=c(0,0,0,400), low=c(0,0,0,350), up=c(24,24,24,500))
解决方案
可以通过tidyr::pivot_longer()结合正则表达式匹配列名来实现,代码如下:
library(tidyr) df2 <- df %>% pivot_longer( cols = everything(), names_to = c("group", ".value"), names_pattern = "q_q(\\d+)(?:_(low|up))?" ) %>% rename(quantile = `NA`) %>% select(quantile, low, up)
代码解释
cols = everything():选中所有需要重塑的列。names_to = c("group", ".value"):将列名拆分为两部分,group用来存储q10/q20/q30/q40的数字标识,.value对应最终要生成的列名(quantile、low、up)。names_pattern:用正则匹配列名结构:q_q(\\d+):匹配q_q后的数字部分,捕获为group;(?:_(low|up))?:可选匹配_low或_up后缀,捕获的内容作为.value的取值;不带后缀的列会对应.value为NA,后续通过rename()转为quantile。
select()用来调整列顺序,得到目标数据结构。
内容的提问来源于stack exchange,提问作者Chloe_pa
相关产品推荐
相关产品推荐

