首页 > 解决方案 > 基于多个条件的子集数据

问题描述

我的 df 看起来像这样:

dfin <- 

ID   DAY   SIZE
1     -5    10
1     -2    15
1      0    10
1      1    20
2      5    20
3      -5   2
3      -4   10
3      1    15

我想对DAY行进行子集处理:如果DAY某个主题的值在值中具有值 0(基线),DAY则该主题的子集数据 DAY >= 0。如果某个主题的值以负数开头(并且没有 0 基线),则从最适合该主题的负数DAY到正数的子集。DAY如果DAY某个主题的值以正数(没有负数DAY)开头,则保留该主题的所有行。

输出应该是这样的:

dfout <- 

ID   DAY   SIZE
1      0    10
1      1    20
2      5    20
3      -4   10
3      1    15

我正在使用 RStudio。如果可能(选项 1)或 dplyr(选项 2),使用 data.table 的首选解决方案。

标签: rdplyrdata.table

解决方案


也许是这样的:

library(data.table)
setDT(dfin)[, 
        if(any(DAY==0)) .SD[DAY>=0]
        else if (DAY[1L] < 0) .SD[last(which(DAY < 0)):.N] 
        else .SD, 
    ID]

输出:

   ID DAY SIZE
1:  1   0   10
2:  1   1   20
3:  2   5   20
4:  3  -4   10
5:  3   1   15

数据:

library(data.table)
dfin <- fread("ID   DAY   SIZE
1     -5    10
1     -2    15
1      0    10
1      1    20
2      5    20
3      -5   2
3      -4   10
3      1    15")

推荐阅读