如果我有以下变量:
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)
Run Code Online (Sandbox Code Playgroud)
我首先要找到所有-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
Run Code Online (Sandbox Code Playgroud)
我现在要做的是检查发生-5的位置之前和之后的5个值,看看是否所有值都等于0,如果是这样,那么保持它的起始索引()如果不从以下位置删除它:index
index
因此,在以下情况下,期望的结果将是:
r
95 101 135
Run Code Online (Sandbox Code Playgroud)
好吧,我设法用两个独立的for循环解决问题,一个if条件和一个临时列表2(一个元素保存索引号一个值)和一个变量用于存储结果.
但是我确定有更好/更短/更快的结果吗?任何建议?在最好的情况下,如果可能的话,我更喜欢基础R答案.
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
113 次 |
最近记录: |