अगर मेरे पास निम्नलिखित चर है:

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 होता है और देखें कि क्या सभी मान समान हैं 0 यदि ऐसा है तो इसे (index) का आरंभिक सूचकांक रखें, यदि इसे index से नहीं हटाया गया:

तो निम्नलिखित मामले में वांछित परिणाम होगा:

r
95 101 135

वैसे मैं लूप के लिए दो स्वतंत्र के साथ समस्या को हल करने में कामयाब रहा हूं और एक यदि स्थिति और 2 की एक अस्थायी सूची (सूचकांक को एक मान को सहेजने वाला एक तत्व) और परिणाम को संग्रहीत करने के लिए एक चर।

लेकिन अच्छी तरह से Iam यकीन है कि वहाँ के लिए एक बेहतर / कम / तेज परिणाम है? किसी को कोई सुझाव? यदि संभव हो तो सबसे अच्छे मामलों में मैं एक बेस आर उत्तर को प्राथमिकता दूंगा।

r
2
Kitumijasi 20 नवम्बर 2015, 13:12

2 जवाब

सबसे बढ़िया उत्तर
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
6
Roland 20 नवम्बर 2015, 11:15

प्रयत्न

index[sapply(index, function(x) all(!numbers[setdiff(pmax(1,
       x-5):pmin(x+5, length(numbers)), x)]))]
#[1]  95 101 135
4
akrun 20 नवम्बर 2015, 10:20