如果我有以下变量:
numbers<-c(1,2,3,-5,4,5,6,-5,1,2,1,1,1,1,7,1,1,1,8,1,1,1,1,1,1,1,1,1,1,9,10,11,12,13,14,15,1,1,1,5
,5,5,5,5,5,5,5,5,5,5,5,5,5,5,78,78,78,78,78,78,78,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,-5,0,0)
我首先要找到所有-5值:
index<-which(numbers == -5)
[1] 4 8 95 101 135 150 151
value<-numbers[which(numbers == -5)]
[1] -5 -5 -5 -5 -5 -5 -5
我现在要做的是检查 -5之前和之后的 5值 -5 的位置,看看所有值是否等于 0 如果是这样的话,请保留它的起始索引(index
),如果不从index
删除它:
因此,在以下情况中,所需的结果将是:
r
95 101 135
我已经设法通过两个独立的for循环来解决问题,一个if条件和一个临时列表2(一个元素保存索引号一个值)和一个用于存储结果的变量。
但我确定有更好/更短/更快的结果吗? 任何建议?在最好的情况下,如果可能的话,我更喜欢基础R答案。
答案 0 :(得分:6)
which(
stats::filter(numbers == 0L,#logical vector
c(rep(1, 5), 0, rep(1, 5)) #sum 5 preceding and following logical values
) == 10L & #10 TRUE values?
numbers == -5L
)
#[1] 95 101 135
答案 1 :(得分:4)
尝试
index[sapply(index, function(x) all(!numbers[setdiff(pmax(1,
x-5):pmin(x+5, length(numbers)), x)]))]
#[1] 95 101 135