我正在尝试删除符合特定条件的行之后x行内的数据框中的行。
我有一个带有响应变量的数据框,一个表示条件的测量类型和时间。这是一个模拟数据集:
data <- data.frame(rlnorm(45,0,1),
c(rep(1,15),rep(2,15),rep(1,15)),
seq(
from=as.POSIXct("2012-1-1 0:00", tz="EST"),
to=as.POSIXct("2012-1-1 0:44", tz="EST"),
by="min"))
names(data) <- c('Variable','Type','Time')
在这个模拟的情况下,我想在条件2发生后删除条件1中的前5行。
我想解决这个问题的方法是生成一个单独的向量,确定每个观察点1的距离是从最后的2开始。这里是我写的代码:
dist = vector()
for(i in 1:nrow(data)) {
if(data$Type[i] != 1) dist[i] <- 0
else {
position = i
tempcount = 0
while(position > 0 && data$Type[position] == 1){
position = position - 1
tempcount = tempcount + 1
}
dist[i] = tempcount
}
}
这段代码可以解决问题,但效率极低。我想知道是否有人有更聪明,更快的解决方案。
答案 0 :(得分:1)
如果我理解正确,这应该可以解决问题:
criteria1 = which(data$Type[2:nrow(data)] == 2 & data$Type[2:nrow(data)] != data$Type[1:nrow(data)-1]) +1
criteria2 = as.vector(sapply(criteria1,function(x) seq(x,x+5)))
data[-criteria2,]
工作原理:
这可能需要稍加修改,我不清楚您的代码中的标准1和标准2是什么。如果有效,或者您需要更多建议,请告诉我们!