R语言如何按年份、股票代码分组保留dirnbr最大的行用于数据集合并
解决方案
以下是不同工具栈下的实现方式,你提到的inner_join属于tidyverse体系,优先推荐dplyr方案:
1. dplyr(tidyverse生态)方案
这是最符合你现有操作习惯的方式,直接分组汇总得到需要的三个字段即可,不需要单独筛选最大行:
library(dplyr) # 处理第二个数据集,生成年度-股票代码对应的董事会总人数表 board_size_df <- 你的第二个数据集名称 %>% group_by(年份, ticker) %>% summarise(董事会总人数 = max(dirnbr, na.rm = TRUE), .groups = "drop") # 直接和第一个数据集合并 final_df <- inner_join(你的第一个数据集名称, board_size_df, by = c("年份", "ticker"))
如果你确实需要实现「保留每组dirnbr最大的行」的逻辑(比如后续需要用到该行的其他字段),可以用slice_max实现:
board_size_df <- 你的第二个数据集名称 %>% group_by(年份, ticker) %>% slice_max(dirnbr, n = 1, with_ties = FALSE) %>% ungroup() %>% select(年份, ticker, 董事会总人数 = dirnbr)
2. data.table方案
如果你的数据集规模很大,用data.table处理速度更快:
library(data.table) # 将数据集转为data.table格式 setDT(你的第二个数据集名称) # 分组取最大值 board_size_dt <- 你的第二个数据集名称[, .(董事会总人数 = max(dirnbr, na.rm = TRUE)), by = .(年份, ticker)]
3. 基础R方案
不需要安装额外依赖包,用原生函数实现:
board_size_df <- aggregate(dirnbr ~ 年份 + ticker, data = 你的第二个数据集名称, FUN = max, na.rm = TRUE) # 重命名第三列为董事会总人数 colnames(board_size_df)[3] <- "董事会总人数"
注意事项
- 参数
na.rm = TRUE用于避免dirnbr存在缺失值时返回NA,如果你的数据无缺失可以移除该参数 - 合并前请确认两个数据集的
年份、ticker字段格式完全一致,比如年份均为数值型、ticker的大小写、前后空格等规则统一,避免匹配失败
内容的提问来源于stack exchange,提问作者revolutionarycap
相关产品推荐
相关产品推荐

