我有一个格式如下的数据集:
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
本身。