如何在预定义值之前和之后选择特定数量的行

时间:2019-04-06 14:40:16

标签: r

我正在尝试从大型时序数据集中选择相关的行。棘手的是,所需的行在列中的某些值之前和之后。

# 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相同,但方向相反)。

非常欢迎任何提示和建议! 谢谢!

1 个答案:

答案 0 :(得分:1)

使用rep及其每个参数很容易。

df$y[rep(which(df$y == 2), each=7L) + -2:4] <- 2

在这里,rep重复标准两次的行索引(值前两个,值L后四个,L表示参数应为整数)。将值-2到4相加即可得到这些索引。现在,替换。

请注意,对于某些比较,由于数值精度,==并不足够。有关此主题的详细讨论,请参见SO帖子why are these numbers not equal。在这种情况下,您可以使用类似

的方法
which(abs(df$y - 2) < 0.001)

或任何精确的度量标准都可以解决您的问题。