如果我有以下变量:
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 个值 并查看所有值是否都等于 0 如果是这样,请保留它的起始索引 (index
) 如果不是,请将其从 index
中删除:
所以在下面的情况下,期望的结果是:
r
95 101 135
好吧,我已经设法通过两个独立的 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
关于r - 检查 R 中变量值 (v) 的前一个/连续数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33824048/