【发布时间】:2019-09-16 13:51:01
【问题描述】:
对于这些数据
library(data.table)
set.seed(42)
dat <- data.table(id=1:12, group=rep(1:3, each=4), x=rnorm(12))
> dat
id group x
1: 1 1 1.37095845
2: 2 1 -0.56469817
3: 3 1 0.36312841
4: 4 1 0.63286260
5: 5 2 0.40426832
6: 6 2 -0.10612452
7: 7 2 1.51152200
8: 8 2 -0.09465904
9: 9 3 2.01842371
10: 10 3 -0.06271410
11: 11 3 1.30486965
12: 12 3 2.28664539
我的目标是从每个组中获取x 大于某个阈值的第一个ID,例如x>1.5。
> dat[x>1.5, .SD[1], by=group]
group id x
1: 2 7 1.511522
2: 3 9 2.018424
确实是正确的,但我对它默默地为第 1 组不产生任何结果这一事实感到不满。相反,我希望它产生每个组的最后一个 id,其中没有 id 满足条件。我发现我可以分两步实现这一目标
> tmp <- dat[x>1.5, .SD[1], by=group]
> rbind(tmp,dat[!group%in%tmp$group,.SD[.N], by=group])
group id x
1: 2 7 1.5115220
2: 3 9 2.0184237
3: 1 4 0.6328626
但我确信我没有充分利用这里的 data.table 功能,这必须允许更优雅的解决方案。
【问题讨论】:
-
关于信息,它没有产生 1 的结果的原因是因为第一部分 (
x>1.5) 过滤了 data.table,因此数据中不存在组 1。表了。
标签: r data.table