我的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的首选解决方案。
答案 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