循环捕获r中大于阈值的差异



我有一个格式如下的数据集:

person_ID  exam_ID value_1  number_studies
A1         1A1     2        3
A1         2A1     3        3
A1         3A1     1        3
A2         1A2     2        5
A2         2A2     3        5
A2         3A2     3.5      5
A2         4A2     1.5      5
A2         5A2     1.0      5

数据先按person_ID排序,然后按exam_ID排序。我想删除以下的任何行,包括value_1之间的差异小于-1的第一行。

例如,对于person_ID 'A1',我会保留exam_id '1A1'和'2A1',但删除'3A1',因为'3A1-2A1'的value_1之间的差异是<1。对于person_ID 'A2',我将删除exam_id 4A2和5A2。

我想用嵌套的while循环来创建一个exam_id列表,然后子集我的数据框架,但代码不工作。参见下面的示例。如有任何建议,我将不胜感激!

z1 <- list()
for(person in unique(df$person_ID)) {
tempdata <- subset(df, df$person_ID == person)
t1 <- seq(from = 1, to = (unique(tempdata$number_studies)-1))
i <- 0
t <- 1
while(t < (unique(tempdata$number_studies)-1)){
while(i>-1){
i <- tempdata[t + 1,3] - tempdata[t,3]
tempID <- tempdata[t,]
z1 <- append(z1, tempID$exam_ID)
t <- t+1
}
}
}

对此不需要循环。下面是使用data.table

的解决方案
library(data.table)
setDT(dat)
dat[ , drop:=cumsum(c(0,diff(value_1))< -1), by=person_ID][drop==0, !"drop"]

person_ID exam_ID value_1 number_studies
1:        A1     1A1     2.0              3
2:        A1     2A1     3.0              3
3:        A2     1A2     2.0              5
4:        A2     2A2     3.0              5
5:        A2     3A2     3.5              5

要理解它是如何工作的,需要创建一个名为drop的变量,该变量增量地计算后续值之间的差值为-1或更小的值的数量。这是由person_ID分层。然后只返回drop为0的行,并删除drop本身。

相关内容

  • 没有找到相关文章

最新更新