R语言:如何用循环按日期筛选DataFrame并合并结果
问题解决:按日期筛选并合并数据
你的需求是按每个唯一日期拆分DataFrame,筛选出micbb == "XNYS"的记录,再取每个子集中ff_mktcap排名前2的条目,最后合并成一个新DataFrame。先说说你原代码的几个问题:
- 列表初始化错误:
a <- list(evaluation_dates)是把日期向量塞进列表第一个元素,不是用来存结果的空列表 - 循环里没针对当前日期的子集操作,直接用了整个
df,而且没有把筛选后的结果赋值给变量 a[[i]] <-后面没有具体的赋值内容,等于没存结果
方法一:用循环实现(符合你的需求)
# 加载需要的包 library(dplyr) # 获取唯一日期向量 evaluation_dates <- unique(df$marketdate) # 初始化一个空列表用来存每个日期的结果 result_list <- list() # 循环处理每个日期 for(i in seq_along(evaluation_dates)){ # 取出当前日期的子集,筛选micbb为XNYS,再取ff_mktcap前2的记录 current_result <- df %>% filter(marketdate == evaluation_dates[i], micbb == "XNYS") %>% top_n(2, ff_mktcap) # 默认降序,取最大的2个;如果要升序加负号:-ff_mktcap # 将结果存入列表 result_list[[i]] <- current_result } # 合并列表中的所有DataFrame combined_screens <- do.call(rbind, result_list)
方法二:更简洁的分组处理(推荐新手学习)
不用循环,直接用dplyr的分组功能,代码更简洁易读:
library(dplyr) combined_screens <- df %>% filter(micbb == "XNYS") %>% # 先筛选所有符合micbb条件的记录 group_by(marketdate) %>% # 按日期分组 top_n(2, ff_mktcap) %>% # 每组取ff_mktcap前2的记录 ungroup() # 取消分组(可选,后续操作更方便)
两种方法都能得到你想要的combined_screens,第二种方法更符合R的tidyverse风格,代码量更少也更不容易出错。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

