循环捕获大于R阈值的差异

myzjeezk  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(121)

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

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“1A 1”和“2A 1”,但删除“3A 1”,因为“3A 1 - 2A 1”的value_1之间的差值〈-1。对于person_ID“A2”,我将删除exam_ID 4A 2和5A 2。
我想用嵌套的while循环来创建一个exam_ID列表,然后将我的 Dataframe 子集化,但是代码不起作用。请参见下面的示例。我将感谢任何建议/意见!

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
   }
 }
}
k2fxgqgv

k2fxgqgv1#

对此,您不需要循环。下面是使用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本身。

相关问题