You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:10:29