R语言pivot操作:含多组字段的宽表转回长表方案咨询
解决方案
你当前的宽表字段统一为[字段类型].[年份]的命名规则,仅用pivot_longer即可完成转换,操作代码如下:
library(tidyverse) mydata.long <- mydata.wide %>% pivot_longer( # 排除id列,其余所有列都参与长宽转换 cols = -id, # 拆分字段名,第一部分作为新列名,第二部分作为year列的值 names_to = c(".value", "year"), # 以英文点作为字段名拆分的分隔符 names_sep = "\\." ) %>% mutate( # 年份转为数值型方便后续分析 year = as.numeric(year), # 显式将2009年的move值设为NA,符合业务逻辑 move = ifelse(year == 2009, NA_character_, move) )
逻辑说明
pivot_longer中的.value是特殊参数,会把拆分字段名得到的第一部分(municip、move)直接作为新生成的列名,不需要额外做列名匹配- 拆分后天然生成id、year、municip、move四个字段,仅需额外处理2009年的move值即可满足需求
- 你也可以优化之前生成迁移变量的逻辑,不需要先转宽表再转回长表,直接在最开始的长表中用
lag()函数按id分组后生成move值,可选方案代码如下:
# 长表直接生成move变量的优化方案 mydata <- mydata %>% arrange(id, year) %>% group_by(id) %>% mutate( last_municip = lag(municip, 1), move = case_when( is.na(last_municip) & is.na(municip) ~ NA_character_, is.na(last_municip) & !is.na(municip) ~ "1", !is.na(last_municip) & !is.na(municip) & last_municip != municip ~ "3", !is.na(last_municip) & is.na(municip) ~ "4", TRUE ~ "2" ) ) %>% select(-last_municip) %>% ungroup()
内容的提问来源于stack exchange,提问作者Joanne Demmler
相关产品推荐
相关产品推荐

