如何为面板数据集创建双向表?R语言人口列年份统计需求
在R中为面板数据集创建双向表
嗨!我来帮你搞定这个问题~首先得明确:我们要基于人口列有可用数据的观测,把长格式的面板数据转换成「个体行×年份列」的双向表,缺失的位置保留空白(对应R里的NA)。下面分两种常用方法实现,你可以按需选择:
先模拟你的数据集(方便演示)
假设你的面板数据是长格式,空白用NA表示缺失值,示例如下:
# 模拟示例面板数据 panel_data <- data.frame( 个体 = rep(c("A", "B", "C"), each = 5), 年份 = rep(2018:2022, 3), 人口 = c(100, NA, 120, 130, NA, NA, 200, 210, NA, 230, 300, 310, NA, 330, 340) )
步骤1:筛选出人口数据可用的观测
先把人口列存在缺失值的行去掉,只保留有效数据:
# 保留人口非缺失的行 filtered_data <- panel_data[!is.na(panel_data$人口), ]
方法1:用tidyverse(推荐,代码更直观)
如果你习惯用tidyverse工具链,pivot_wider函数可以轻松把长格式转成宽格式的双向表:
# 先加载tidyverse包(未安装的话先运行install.packages("tidyverse")) library(tidyverse) # 创建双向表:行是个体,列是年份,值是人口 cross_table <- filtered_data %>% pivot_wider( id_cols = 个体, # 指定作为行的变量 names_from = 年份, # 指定作为列的变量 values_from = 人口, # 填充单元格的变量 values_fill = NA # 缺失位置用NA(对应你的空白)填充 ) # 查看结果 print(cross_table)
运行后会得到类似这样的结果:
# A tibble: 3 × 6 个体 `2018` `2019` `2020` `2021` `2022` <chr> <dbl> <dbl> <dbl> <dbl> <dbl> 1 A 100 NA 120 130 NA 2 B NA 200 210 NA 230 3 C 300 310 NA 330 340
方法2:用基础R(无需额外装包)
如果你不想加载第三方包,可以用基础R的reshape函数实现:
# 转换为宽格式 cross_table_base <- reshape( filtered_data, idvar = "个体", # 指定行变量 timevar = "年份", # 指定列变量 direction = "wide", # 声明转成宽格式 v.names = "人口" # 指定填充单元格的变量 ) # 移除列名里的"人口."前缀,让列名直接显示年份 colnames(cross_table_base) <- gsub("人口\\.", "", colnames(cross_table_base)) # 查看结果 print(cross_table_base)
额外需求:统计数据可用性的双向表
如果你想要的是标记每个个体在哪些年份有人口数据(用1表示有,0表示无),可以用table函数:
# 生成可用性计数表(每个个体-年份组合的有效数据数量) availability_table <- table(filtered_data$个体, filtered_data$年份) # 转成数据框格式查看 as.data.frame.matrix(availability_table)
结果会是:
2018 2019 2020 2021 2022 A 1 0 1 1 0 B 0 1 1 0 1 C 1 1 0 1 1
内容的提问来源于stack exchange,提问作者Pedro Esteban Rodriguez
相关产品推荐
相关产品推荐

