R 通过给定变量查找条件的第一个匹配项
我有数据R 通过给定变量查找条件的第一个匹配项,r,data.table,conditional,vectorization,R,Data.table,Conditional,Vectorization,我有数据 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.
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
我希望可以使用
data.table
,因为这一直让我惊讶于它的效率,但是其他一些可以快速完成这项工作的功能也可以工作 我们可以在i
中指定条件,按“id”分组,使用.i
获取第一个元素的索引,提取列($V1
)
使用
tidyverse
,这一点出人意料地困难
library(tidyverse)
dat %>%
mutate(rn = row_number()) %>%
filter(x > 0) %>%
group_by(id) %>%
slice(1L) %>%
pull(rn)
#[1] 1 4 7 11 12
如果有一些id不满足条件,我们希望为它们使用NA:
dat[(id=unique(id),x_dn=0),on=(id,x>x_dn),mult=“first”,which=TRUE]
dat[x >0, .I[1], id]$V1
#[1] 1 4 7 11 12
library(tidyverse)
dat %>%
mutate(rn = row_number()) %>%
filter(x > 0) %>%
group_by(id) %>%
slice(1L) %>%
pull(rn)
#[1] 1 4 7 11 12