R语言:基于另一数据框的日期与公园字段过滤目标数据框行
方案1:使用tidyverse(dplyr)实现(代码可读性更高)
首先加载dplyr包,先计算AC_example中每个公园的最早记录月份,再关联到reports_example做过滤:
library(dplyr) # 1. 统一转换Month列为日期格式,避免字符串比较出错 reports_example$Month <- as.Date(reports_example$Month) AC_example$Month <- as.Date(AC_example$Month) # 2. 计算每个公园在AC_example中的最早月份 park_min_month <- AC_example %>% group_by(Park) %>% summarise(min_ac_month = min(Month), .groups = "drop") # 3. 关联后过滤符合要求的行 reports_final_example <- reports_example %>% left_join(park_min_month, by = "Park") %>% filter(Month >= min_ac_month) %>% select(Month, Park) # 查看结果 print(reports_final_example)
运行后输出和你期望的结果完全一致:
Month Park 1 2020-05-01 Aspen_Heights 2 2021-06-01 Aspen_Heights 3 2020-03-01 Auburn_Bay
方案2:使用Base R实现(无需加载第三方包)
# 1. 转换Month列为日期格式 reports_example$Month <- as.Date(reports_example$Month) AC_example$Month <- as.Date(AC_example$Month) # 2. 计算每个公园的最早月份 park_min_month <- aggregate(Month ~ Park, data = AC_example, FUN = min) colnames(park_min_month)[2] <- "min_ac_month" # 3. 合并数据并过滤 merged_df <- merge(reports_example, park_min_month, by = "Park") reports_final_example <- merged_df[merged_df$Month >= merged_df$min_ac_month, c("Month", "Park")] # 重排行序(可选,和你给出的示例顺序一致) reports_final_example <- reports_final_example[order(reports_final_example$Park, reports_final_example$Month), ] # 查看结果 print(reports_final_example)
内容的提问来源于stack exchange,提问作者Gab_Laj
相关产品推荐
相关产品推荐

