通过给定变量查找条件的第一个匹配项
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
我有资料
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