我正在尝试从大量的时间序列数据集中选择相关的行。棘手的一点是,所需的行在列中的某些值之前和之后。
# example data
x <- rnorm(100)
y <- rep(0,100)
y[c(13,44,80)] <- 1
y[c(20,34,92)] <- 2
df <- data.frame(x,y)在本例中,df$y列中的临界值为1和2。例如,如果我想选择df$y==1之前的2行和之后的4行,我可以这样做:
ones<-which(df$y==1)
selection <- NULL
for (i in ones) {
jj <- (i-2):(i+4)
selection <- c(selection,jj)
}
df$selection <- 0
df$selection[selection] <- 1可以说,这对于更多的值来说,可伸缩性很差。对于df$y==2,我必须重复以下内容:
twos<-which(df$y==2)
selection <- NULL
for (i in twos) {
jj <- (i-2):(i+4)
selection <- c(selection,jj)
}
df$selection[selection] <- 2理想的场景是这样一个函数,它执行类似于这个虚构函数selector(data=df$y, values=c(1,2), before=2, after=5, afterafter = FALSE, beforebefore=FALSE)的操作,其中向values提供临界值,向before提供之前要选择的行数,并相应地向after提供行数。
然而,afterafter允许从某些行到值之后的某些行,例如after=5,afterafter=10 (与afterafter相同,但进入另一个方向)。
欢迎提出任何建议和建议!谢谢!
发布于 2019-04-06 22:54:41
有了rep和它的每个参数,这就足够简单了。
df$y[rep(which(df$y == 2), each=7L) + -2:4] <- 2在这里,rep将符合您的标准的行索引重复7次(两次在值之前,四次在L之后,L表示参数应该是整数)。将值-2到4相加即可获得这些索引。现在,替换。
请注意,对于某些比较,由于数值精度的原因,==是不够的。有关此主题的详细讨论,请参阅SO post why are these numbers not equal。在这些情况下,您可以使用类似于
which(abs(df$y - 2) < 0.001)或者任何精确的测量方法都可以解决你的问题。
https://stackoverflow.com/questions/55550167
复制相似问题