【问题标题】:Subset data based on first occurrence of a status flag基于第一次出现状态标志的子集数据
【发布时间】:2018-09-25 05:02:32
【问题描述】:

我的数据如下所示:

dfin <- 
ID   TIME   CONC   STATUS
 1    0      5      0
 1    1      4      1
 1    2      3      0
 2    0      2      0 
 2    10     2      0
 2    15     1      0

STATUS==1TIME &gt; 0 时,我想将dfin 的第一次出现(对于每个ID)进行子集化。如果主题ID 在任何时候都没有记录STATUS==1,那么我需要对该主题的最后一个原始数据进行子集化。

这里的输出应该是:

dfout <- 
ID   TIME   CONC   STATUS
 1    1      4      1
 2    15     1      0

【问题讨论】:

    标签: r


    【解决方案1】:

    使用dplyr 的一种方式,我们可以group_by ID 并检查是否有任何行满足我们的条件(STATUS == 1 &amp; TIME &gt; 0),如果是,那么我们使用@ 获得满足条件的第一行987654325@,如果没有这样的行,那么我们只需使用n()返回最后一行。

    library(dplyr)
    df %>%
      group_by(ID) %>%
      slice(ifelse(any(STATUS == 1 & TIME > 0), which.max(STATUS == 1 & TIME > 0), n()))
    
    #     ID  TIME  CONC STATUS
    #  <int> <int> <int>  <int>
    #1     1     1     4      1
    #2     2    15     1      0
    

    另一种仅使用基数 R 的方法。这实际上遵循与 dplyr 相同的逻辑,但 ave 返回的长度与输入相同,因此我们仅保留 unique 值并对其进行累积总和 (cumsum)从数据框中获取对应的行。

    df[cumsum(unique(with(df, ave(STATUS == 1 & TIME > 0, ID, FUN = function(x) 
             if(any(x)) which.max(x) else length(x))))), ]
    
    #  ID TIME CONC STATUS
    #2  1    1    4      1
    #5  2   10    2      0
    

    【讨论】:

      【解决方案2】:

      这是data.table 的一种方法。将data.frame转换为'data.table'(setDT(dfin)),按'ID'分组,ifany'STATUS'为1,然后得到'TIME'大于0的逻辑表达式或 else 获取最后一行 (.N) 和 .SD 的子集

      library(data.table)
      setDT(dfin)[,  .SD[if(any(STATUS == 1)) STATUS == 1& TIME  > 0 else .N], ID]
      #   ID TIME CONC STATUS
      #1:  1    1    4      1
      #2:  2   15    1      0
      

      也可以写成

      setDT(dfin)[, .SD[(STATUS == 1 & TIME > 0)| (!any(STATUS) & seq_len(.N) == .N)], ID]
      

      数据

      dfin <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L), TIME = c(0L, 1L, 
       2L, 0L, 10L, 15L), CONC = c(5L, 4L, 3L, 2L, 2L, 1L), STATUS = c(0L, 
       1L, 0L, 0L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
       -6L))
      

      【讨论】:

        猜你喜欢
        • 2020-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        相关资源
        最近更新 更多