我有一个格式如下的数据集:
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
}
}
}
1条答案
按热度按时间k2fxgqgv1#
对此,您不需要循环。下面是使用
data.table
的解决方案为了了解它的工作原理,我们创建了一个名为
drop
的变量,它递增地计算后续值之间的差值为-1或更小的值的数量。这是按person_ID
分层的。然后,只返回drop
为0的行,并删除drop
本身。