R语言中计算跨国面板数据集各变量有效观测时间范围
统计跨国面板各变量全局有效观测时间范围
问题场景
针对跨国面板数据集,排除country(国家)、year(年份)两个标识列,统计其余每个变量在所有国家样本中的:
- 首个存在非缺失(非NA)有效观测的年份
- 最后一个存在非缺失有效观测的年份
最终输出规整的三列数据框。
测试数据
使用问题给出的示例数据集:
mydata <- structure(list(country = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D" ), year = c(1980L, 1981L, 1982L, 1983L, 1984L, 1980L, 1981L, 1982L, 1983L, 1984L, 1980L, 1981L, 1982L, 1983L, 1984L, 1980L, 1981L, 1982L, 1983L, 1984L), ratio = c(NA, 0.295374242728576, 0.39086487214081, 0.305486429622397, NA, NA, NA, 0.219852746929973, 0.36993286316283, NA, NA, 0.275014761742204, 0.375281228218228, 0.351254417048767, NA, NA, NA, NA, 0.281099080992863, NA), ratio2 = c(0.493465579114854, 0.84949842300266, 0.880158872716129, 0.496730178780854, 0.621339708380401, 0.405148166045547, 0.785535878129303, 0.783708103187382, 0.414490845240653, 0.341050366312265, 0.559447590634227, 0.636841595172882, 0.443167371489108, 0.132577145472169, 0.450228306651115, 0.239580681361258, 0.870582599751651, 0.116267577186227, 0.596920453198254, 0.333549798093736)), row.names = c(NA, -20L), class = "data.frame")
实现方案
基础R版(无第三方依赖,适配超大型数据集)
无需安装加载额外包,计算效率高,直接运行即可得到结果:
# 提取所有待统计的数值变量,排除国家、年份标识列 target_vars <- setdiff(colnames(mydata), c("country", "year")) # 逐变量计算首尾有效观测年份 result <- data.frame( variable = target_vars, firstyear = as.character(sapply(target_vars, function(col) min(mydata$year[!is.na(mydata[[col]])]))), lastyear = as.character(sapply(target_vars, function(col) max(mydata$year[!is.na(mydata[[col]])]))) )
结果验证
运行后输出的result和期望格式完全一致:
variable firstyear lastyear 1 ratio 1981 1983 2 ratio2 1980 1984
与问题给出的期望输出结构完全匹配:
structure(list(variable = c("ratio", "ratio2"), firstyear = c("1981", "1980"), lastyear = c("1983", "1984")), class = "data.frame", row.names = c(NA, -2L))
补充:如果需要分国家单独统计每个国家下各变量的有效时间范围,将上述计算逻辑按
country列分组执行即可;上述实现为跨所有国家统计全局有效观测时间范围,符合问题要求。
内容的提问来源于stack exchange,提问作者user3227641
相关产品推荐
相关产品推荐

