You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用data.table筛选面板数据中观测年数≥3的ID的全部记录

问题描述

现有如下面板数据集:

library(data.table)
data <- data.table(ID = c(1,1,1,1,2,2,3,3,3),
                   year = c(1,2,3,4,1,2,1,2,3),
                   score1 = c(90,78,92,69,86,73,82,85,91))

原数据预览:

> data
   ID year score1
1:  1    1     90
2:  1    2     78
3:  1    3     92
4:  1    4     69
5:  2    1     86
6:  2    2     73
7:  3    1     82
8:  3    2     85
9:  3    3     91

需求为仅保留至少有3年观测值的ID对应的全部观测行。之前尝试的写法data[data$year >= 3, ]会将符合条件ID的第1、2年观测也剔除,不符合预期,期望输出结果如下:

ID year score1
1:  1    1     90
2:  1    2     78
3:  1    3     92
4:  1    4     69
5:  3    1     82
6:  3    2     85
7:  3    3     91
实现方案

data.table下有两种常用的实现方式:

方式1:分组直接筛选(简洁写法)

利用data.table的分组内置变量.N(每组行数)和.SD(每组所有数据)实现:

result <- data[, .SD[.N >= 3], by = ID]

逻辑说明:按ID分组后,仅保留组内行数>=3的所有行。

方式2:预筛有效ID再匹配(大数据量更高效)

先统计每个ID的观测数,筛选出符合要求的ID后再匹配回原表,内存占用更低、运算速度更快,适合百万级以上的大面板数据:

# 筛选观测数>=3的有效ID
valid_id <- data[, .(obs_cnt = .N), by = ID][obs_cnt >=3, ID]
# 匹配原表保留有效ID的所有行
result <- data[ID %in% valid_id]

两种写法运行结果均和预期输出一致。


内容的提问来源于stack exchange,提问作者codemachino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:09:05