在R中如何转置时间序列单列数据以适配其余数据集?
你需要完成的是长表转宽表的操作,以下是两种常用实现方案:
使用tidyverse包实现(最简便)
首先加载tidyverse套件,用pivot_wider函数完成转换,同时会自动处理列名生成:
library(tidyverse) # 执行转换 ds_wide <- ds %>% # 清理Reg_crimes列:去除多余空格、转换为数值类型 mutate(Reg_crimes = as.numeric(trimws(Reg_crimes))) %>% # 移除长表专属的行ID列 select(-ID) %>% # 长转宽核心操作 pivot_wider( id_cols = c(Province, Year, Month), # 固定保留的维度列 names_from = crime_name, # 新列名取自crime_name的不同值 values_from = Reg_crimes # 新列值取自对应类别的立案数 ) %>% # 按需添加新的行ID列,放在最左侧 mutate(ID = row_number(), .before = 1)
使用R基础函数实现(无需加载第三方包)
如果你不想安装额外包,可以用基础函数reshape完成转换:
# 先清理Reg_crimes列 ds$Reg_crimes <- as.numeric(trimws(ds$Reg_crimes)) # 长转宽核心操作 ds_wide <- reshape( ds, idvar = c("Province", "Year", "Month"), # 固定维度列 timevar = "crime_name", # 要展开为列的字段 direction = "wide" ) # 清理默认生成的列名前缀,还原为犯罪类型名称 colnames(ds_wide) <- gsub("Reg_crimes\\.", "", colnames(ds_wide)) # 生成新的行ID列并调整列顺序 ds_wide$ID <- seq(nrow(ds_wide)) ds_wide <- ds_wide[, c("ID", "Province", "Year", "Month", unique(ds$crime_name))]
补充说明
- 若某省份、年份、月份组合下缺少某类犯罪的记录,转换后对应位置默认填充
NA,你可以在pivot_wider中添加values_fill = 0参数,将空缺值替换为0。 - 转换前请确认
Reg_crimes已转换为数值类型,避免后续统计运算出错。
内容的提问来源于stack exchange,提问作者user12973342
相关产品推荐
相关产品推荐

