如何基于一个DataFrame的均值查找另一个DataFrame中对应变量的首次达标年份?
获取变量首次达到均值的年份解决方案
需求说明
- 现有两个DataFrame:df1存储变量及其对应均值,df2存储各变量随年份变化的数值
- 需实现:
- 找出每个变量首次达到或超过对应均值的年份
- 若变量从未达标,标记为「未出现」
示例数据
df1(变量均值表)
| Variable | Mean |
|---|---|
| 1 | 5 |
| 2 | 6 |
| 3 | 7 |
df2(变量逐年数值表)
| Variable | Year | Value |
|---|---|---|
| 1 | 2000 | 1 |
| 2 | 2000 | 3 |
| 3 | 2000 | 7 |
| 1 | 2001 | 4 |
| 2 | 2001 | 6 |
| 3 | 2001 | 9 |
| 1 | 2002 | 1 |
| 2 | 2002 | 7 |
| 3 | 2002 | 10 |
| 1 | 2003 | 4 |
原代码问题分析
- 第一次代码报错
longer object length is not a multiple of shorter object length,原因是df2$Variable == df1$Variable属于向量循环匹配,df2行数远多于df1,长度不匹配导致逻辑判断混乱。 - 第二次用
%in%解决了长度问题,但df2$Value >= df1$Mean无法对应到每个变量的专属均值,本质是没建立变量与均值的一一对应关联。
解决方案
方法1:Base R实现
步骤:
- 合并两个数据集,通过
Variable关联每个数值对应的均值 - 按变量分组,筛选出数值≥均值的行
- 对每个组取最早的年份,未达标组标记为「未出现」
# 合并数据集,关联每个变量的均值 merged_df <- merge(df2, df1, by = "Variable") # 筛选达标行,并按变量+年份排序 qualified <- merged_df[merged_df$Value >= merged_df$Mean, ] qualified <- qualified[order(qualified$Variable, qualified$Year), ] # 提取每个变量的首次达标年份 first_qualified <- aggregate(Year ~ Variable, data = qualified, FUN = function(x) x[1]) # 与原变量列表合并,填充未达标项 result <- merge(df1, first_qualified, by = "Variable", all.x = TRUE) result$Year <- ifelse(is.na(result$Year), "未出现", result$Year) # 查看结果 print(result)
运行结果:
| Variable | Mean | Year |
|---|---|---|
| 1 | 5 | 未出现 |
| 2 | 6 | 2001 |
| 3 | 7 | 2000 |
方法2:dplyr实现(更简洁)
利用dplyr的分组、筛选和取首行功能,逻辑更清晰:
library(dplyr) result <- df2 %>% # 关联每个变量的均值 left_join(df1, by = "Variable") %>% # 按变量分组 group_by(Variable) %>% # 筛选达标行,取最早的一行 filter(Value >= Mean) %>% slice_head(n = 1) %>% # 保留需要的列 select(Variable, Year) %>% # 与原变量列表合并,填充未达标项 right_join(df1, by = "Variable") %>% mutate(Year = ifelse(is.na(Year), "未出现", as.character(Year))) %>% ungroup() # 查看结果 print(result)
运行结果和Base R方法一致。
内容的提问来源于stack exchange,提问作者BrittL
相关产品推荐
相关产品推荐

