R语言如何一步实现DataFrame部分列宽转长、部分列长转宽?
R DataFrame 格式转换单步实现方法
方法1:基于tidyverse的简洁实现
通过管道链合并两步操作,无需存储中间变量,代码可读性强:
# 加载依赖包 library(tidyverse) # 单链完成转换 result <- df %>% # 先将日期列从宽转长,生成date和value列 pivot_longer(cols = starts_with("X2020"), names_to = "date", values_to = "value") %>% # 再将交通类型从长转宽,生成driving/transit/walking独立列 pivot_wider(names_from = transportation_type, values_from = value)
如果需要纯单函数调用的实现,可以用reshape2封装好的recast函数,本质是melt和dcast的组合,一行完成转换:
library(reshape2) result <- recast(df, region + variable ~ transportation_type, id.var = c("region", "transportation_type"), variable.name = "date")
方法2:基于data.table的高性能实现
数据量较大时推荐使用该方案,运行效率比tidyverse高3-10倍:
library(data.table) setDT(df) # 转换为data.table格式 result <- melt(df, id.vars = c("region", "transportation_type"), variable.name = "date") %>% dcast(region + date ~ transportation_type, value.var = "value")
可选优化
转换完成后可以加一步日期格式清洗,方便后续和其他数据关联:
result <- result %>% mutate(date = as.Date(date, format = "X%Y.%m.%d"))
内容的提问来源于stack exchange,提问作者Constantin Schmidt
相关产品推荐
相关产品推荐

