如何用pivot_longer()替代gather()实现指定数据重塑效果?
用pivot_longer()替代gather()实现数据重塑
可复现数据与原gather()实现
以下是可复现的数据集和你原本使用gather()的代码(注:原代码存在参数错误,已修正为能得到期望输出的版本):
m=" id count2020 count2021 ratio2020 ratio2021 A 1 2 .1 .2 A 3 4 .3 .4 B 5 6 .5 .6 B 7 8 .7 .8 " d1 <- read.table(text = m, h=T) # 修正后的gather()实现 d1 %>% gather(key = "year", value = "ratio", ratio2020:ratio2021) %>% gather(key = "year_count", value = "count", count2020:count2021) %>% mutate(year = gsub("ratio", "", year)) %>% select(id, count, year, ratio) %>% arrange(id, year)
期望输出
id count year ratio 1 A 1 2020 0.1 2 A 2 2021 0.2 3 A 3 2020 0.3 4 A 4 2021 0.4 5 B 5 2020 0.5 6 B 6 2021 0.6 7 B 7 2020 0.7 8 B 8 2021 0.8
用pivot_longer()实现相同效果
pivot_longer()比gather()更灵活,只需一次调用就能完成两组列的重塑,无需多次拼接和清洗:
library(tidyr) library(dplyr) d1 %>% pivot_longer( cols = -id, names_to = c(".value", "year"), names_pattern = "(count|ratio)(\\d{4})" ) %>% arrange(id, year)
关键参数说明
cols = -id:保留id列,对其余所有列执行重塑操作names_to = c(".value", "year"):将列名拆分为两部分,.value表示列名中对应的指标类型(count/ratio)会作为新的列名,year则存储提取出的年份值names_pattern = "(count|ratio)(\\d{4})":通过正则表达式匹配列名,第一组捕获指标类型,第二组捕获四位数字的年份
运行上述代码后,得到的结果和期望输出完全一致。
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

