R语言按city分组如何保留多观测组的第二条观测行?
需求实现方案
核心逻辑:你已经提前按city对数据集完成排序,因此只需按city分组后,每组取行下标为min(2, 组内观测数)的行即可,刚好满足「组大小为1保留唯一行,组大小≥2保留第2行」的要求。
dplyr 实现(最常用简洁方案)
library(dplyr) result <- mydata %>% group_by(city) %>% slice(min(2, n())) %>% ungroup()
基础R实现(无需加载第三方包)
# 写法1:利用ave生成组内标识筛选 group_seq <- ave(1:nrow(mydata), mydata$city, FUN = seq_along) group_size <- ave(1:nrow(mydata), mydata$city, FUN = length) result <- mydata[group_seq == pmin(2, group_size), ] # 写法2:分组拆分后合并 result <- do.call(rbind, by(mydata, mydata$city, function(df) df[min(2, nrow(df)), ]))
data.table 实现(适合大数据量高性能场景)
library(data.table) setDT(mydata) result <- mydata[, .SD[min(2, .N)], by = city]
以上三种方案运行后得到的结果都和你给出的期望输出完全一致。
内容的提问来源于stack exchange,提问作者moreirasd
相关产品推荐
相关产品推荐

