通过给定变量查找条件的第一个匹配项

Find first match of condition by given variable

我有资料

library(data.table); set.seed(42)
dat <- data.table(id=c(1,1,1,2,2,3,3,3,3,3,4,5,5,5,5), x=rnorm(15))
> dat
#    id           x
# 1:  1  1.37095845
# 2:  1 -0.56469817
# 3:  1  0.36312841
# 4:  2  0.63286260
# 5:  2  0.40426832
# 6:  3 -0.10612452
# 7:  3  1.51152200
# 8:  3 -0.09465904
# 9:  3  2.01842371
#10:  3 -0.06271410
#11:  4  1.30486965
#12:  5  2.28664539
#13:  5 -1.38886070
#14:  5 -0.27878877
#15:  5 -0.13332134

我想为每个 id 获取满足 x 中某些条件的第一个值的索引。例如,对于条件 x>0,这将给出

> res
#[1]  1  4  7 11 12

我希望可以使用 data.table,因为它的效率一直令我惊讶,但其他一些可以快速完成此操作的功能也可以使用。

我们可以在 i 中指定条件,按 'id' 分组,用 .I 获取第一个元素的索引,提取列 ($V1)

dat[x >0, .I[1], id]$V1
#[1]  1  4  7 11 12

tidyverse

出奇地难
library(tidyverse)

dat %>% 
 mutate(rn = row_number()) %>% 
 filter(x > 0) %>% 
 group_by(id) %>% 
 slice(1L) %>% 
 pull(rn)

#[1]  1  4  7 11 12