【问题标题】:Find first match of condition by given variable通过给定变量查找条件的第一个匹配项
【发布时间】:2018-08-03 12:32:55
【问题描述】:

我有数据

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&gt;0,这将给出

> res
#[1]  1  4  7 11 12

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

【问题讨论】:

    标签: r data.table conditional vectorization


    【解决方案1】:

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

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

    【讨论】:

    • 如果有一些 id 永远不满足条件,我们想要 NA:dat[.(id = unique(id), x_dn = 0), on=.(id, x &gt; x_dn), mult="first", which=TRUE]
    【解决方案2】:

    tidyverse 的难度出奇地高,

    library(tidyverse)
    
    dat %>% 
     mutate(rn = row_number()) %>% 
     filter(x > 0) %>% 
     group_by(id) %>% 
     slice(1L) %>% 
     pull(rn)
    
    #[1]  1  4  7 11 12
    

    【讨论】:

      猜你喜欢
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多