我正在尝试从大型时序数据集中选择相关的行。棘手的是,所需的行在列中的某些值之前和之后。
# 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
相同,但方向相反)。
非常欢迎任何提示和建议! 谢谢!
答案 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)
或任何精确的度量标准都可以解决您的问题。