基于多个条件的子集数据

时间:2019-07-22 03:18:21

标签: r dplyr data.table

我的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值在DAY值中具有值0(基线),则该子集数据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的首选解决方案。

3 个答案:

答案 0 :(得分:3)

可能类似于:

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")

答案 1 :(得分:1)

我们可以编写一个包含所有条件的函数

func <- function(value) {
    if (any(value == 0))
        which(value >= 0)
    else if (any(value < 0))
      max(which(value < 0)) :  max(which(value > 0))
    else seq_along(value)
}

并将其应用于每个组

library(data.table)
df[setDT(df)[, .I[func(DAY)], by = ID]$V1,]

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

dplyr中,我们可以使用slice

library(dplyr)

df %>%
  group_by(ID) %>%
  slice(func(DAY))

#     ID   DAY  SIZE
#   <int> <int> <int>
#1     1     0    10
#2     1     1    20
#3     2     5    20
#4     3    -4    10
#5     3     1    15

数据

df <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 3L, 3L, 3L), DAY = 
c(-5L, -2L, 0L, 1L, 5L, -5L, -4L, 1L), SIZE = c(10L, 15L, 10L, 20L, 
20L, 2L, 10L, 15L)), class = "data.frame", row.names = c(NA, -8L))

答案 2 :(得分:0)

  

我想对In file included from Modules/LDAPObject.c:8: Modules/constants.h:7:10: fatal error: lber.h: No such file or directory #include "lber.h" ^~~~~~~~ compilation terminated. error: command 'gcc' failed with exit status 1 行进行子集处理,以便:如果主题的DAY值在DAY值中具有值0(基线),则该子集数据DAY> = 0学科。如果某个主题的值以负数开头(并且没有0基线),则从该主题的壁橱负DAY到正DAY的子集。如果某个主题的DAY的值以正数开头(无负DAY),则保留该主题的所有行。

也就是说,我们要严格在特定的DAY之前删除所有内容,该值等于零或最接近的负DAY:

DAY
相关问题