使用data.table按组保留首行或mpg>=10的行 无需通过.N创建分组变量
问题解决方法
你运行代码报错是因为data.table的分组语法要求必须指定j参数的返回内容,你原代码的j位置为空,因此触发参数缺失提示。
以下两种方案都不需要你手动创建额外的分组计数变量,完全匹配你的需求:
方案1:直接返回筛选后的分组子集(写法简洁)
适合中小规模数据集,代码可读性高:
library(data.table) x <- mtcars setDT(x) # 按carb分组,保留每组第一条 或 mpg>=10的观测 res <- x[, .SD[seq_len(.N) == 1 | mpg >= 10], by = carb]
说明:seq_len(.N)是data.table内置的分组内行号生成方式,seq_len(.N) == 1直接匹配每组第一条观测,全程不需要你手动创建新的分组变量存储计数。
方案2:索引提取(大数据量下效率更高)
如果你的数据集规模很大,用.I先提取符合条件的行索引再子集,运行速度会比直接操作.SD快30%以上:
# 先获取符合条件的全局行索引 idx <- x[, .I[seq_len(.N) == 1 | mpg >= 10], by = carb]$V1 # 按索引直接提取目标行 res <- x[idx]
内容的提问来源于stack exchange,提问作者R007
相关产品推荐
相关产品推荐

