如何用dplyr优雅实现数据框按指定列将行拆分为多行?
用dplyr+tidyr优雅实现宽表转长表
嘿,你要的其实是典型的宽数据转长数据操作,用tidyverse生态里的dplyr结合tidyr的pivot_longer()函数就能完美搞定,这绝对是你要找的优雅解决方案~
第一步:先模拟你的原始数据
首先我们先还原你的输入数据框:
library(dplyr) library(tidyr) # 模拟原始宽格式数据 df <- tibble( x = c(0, 1), Total = c(13, 19), PartA = c(6, 8), PartB = c(7, 11) )
第二步:核心转换代码
只用几行管道操作就能完成转换,完全符合dplyr的风格:
df_long <- df %>% pivot_longer( cols = -x, # 保留x列,将其余所有列转为行 names_to = "Colname", # 原列名存入新列Colname values_to = "Val" # 原列的数值存入新列Val )
参数解释
cols = -x:表示除了x列之外,其他所有列都需要被“拉长”成行;如果你想指定特定列(比如只转Total、PartA),也可以写成cols = c(Total, PartA, PartB)names_to:定义原来的列名要放到哪个新列里,这里就是你要的Colnamevalues_to:定义原来列中的数值要放到哪个新列里,对应你要的Val
最终结果
运行后得到的数据结构完全符合你的需求:
df_long #> # A tibble: 6 × 3 #> x Colname Val #> <dbl> <chr> <dbl> #> 1 0 Total 13 #> 2 0 PartA 6 #> 3 0 PartB 7 #> 4 1 Total 19 #> 5 1 PartA 8 #> 6 1 PartB 11
内容的提问来源于stack exchange,提问作者KeV
相关产品推荐
相关产品推荐

