如何用tidyverse批量统计各国各变量无NA值的首尾年份?
批量提取各国各变量无NA值的首尾年份
我有一份涵盖20个国家、40个变量的大型数据集,部分变量的首尾年份存在NA值。我需要提取每个国家下,各变量无NA值的首个年份与最后一个年份。
之前手动处理英国GDP列的代码可得到预期结果:
min(sort(table$year[table$Country=="UK"][which(!is.na(table$GDP))])) [1] "1959" max(sort(table$year[table$Country=="UK"][which(!is.na(table$GDP))])) [1] "2020"
但这种手动方式效率极低,希望借助tidyverse工具实现批量处理,得到如下格式的输出:
Country Variable min max 1 UK GDP 1959 2020 2 FR GDP 1980 2020 3 IT GDP 1980 2020 4 UK Inflation 1990 2022 5 FR Inflation 2000 2022 6 IT Inflation 2000 2022
用tidyverse实现批量处理
通过数据转长格式 + 分组聚合可高效完成需求,具体步骤与代码如下:
代码实现
library(tidyverse) # 将宽格式数据集转为长格式(保留国家、年份列,其余变量列转为变量名+值的结构) long_table <- table %>% pivot_longer( cols = -c(Country, year), names_to = "Variable", values_to = "Value" ) # 分组计算每个国家-变量组合的首尾有效年份 result <- long_table %>% filter(!is.na(Value)) %>% # 过滤变量值为NA的行 group_by(Country, Variable) %>% # 按国家和变量分组 summarise( min = min(year), max = max(year), .groups = "drop" # 取消分组,生成整洁结果表 ) # 查看最终结果 print(result)
关键步骤说明
pivot_longer:把原宽表转为长表结构,让每个国家的每一个变量值对应单独一行,为后续分组计算提供基础。filter(!is.na(Value)):仅保留变量值非NA的有效数据行,避免NA值干扰年份计算。group_by + summarise:按国家和变量分组后,分别计算每组内的最小年份(首个有效年份)和最大年份(最后一个有效年份)。
注意:如果你的
year列是字符类型,建议在计算前先转为数值型,避免字符排序导致的错误,可添加mutate(year = as.numeric(year))步骤。
内容的提问来源于stack exchange,提问作者karlakolumna
相关产品推荐
相关产品推荐

