x <- seq(1:100)
  y <- 30

अगर मैं उस स्थान का निर्धारण करना चाहता हूं जिस पर x> y . का संचयी योग है

  which.max(cumsum(x) >= y)
  [1] 9 # 

इसके बजाय, यदि y एक सदिश है यानी मैं y के प्रत्येक तत्व के लिए वापस जाना चाहता हूं, तो x . की स्थिति

  y <- c(30, 60, 80, 90)
  which.max(cumsum(x) >= y)
  [1] 9

यह पदों के वेक्टर को पुन: ट्यून क्यों नहीं कर रहा है?

1
89_Simple 13 सितंबर 2018, 17:20

3 जवाब

सबसे बढ़िया उत्तर

एक अन्य वेक्टरकृत विचार max.col का उपयोग outer के साथ करना है, अर्थात।

max.col(t(outer(cumsum(x), y, `>`)), 'first')
#[1]  8 11 13 13
5
Sotos 13 सितंबर 2018, 17:37

संक्षिप्त उत्तर: क्योंकि यह y में वेक्टरकृत नहीं है और which.max 1 से अधिक मान नहीं लौटाता है।

लंबा जवाब:

which.max केवल लंबाई 1 या 0 का पूर्णांक देता है। यह आपके पहले मामले में काम करता है क्योंकि आप केवल एक मान की तलाश कर रहे हैं।

इसके अलावा, वेक्टर रीसाइक्लिंग तब होता है जब आप विभिन्न लंबाई के वैक्टर की तुलना कर रहे होते हैं। फिर, पहले मामले में यह सीधा है, लंबाई के रूप में 1 वेक्टर पुनर्नवीनीकरण हो जाएगा और लंबे वेक्टर के प्रत्येक तत्व से मेल खाएगा। हालांकि, जब छोटे वेक्टर में कई तत्व होते हैं, तो आप जो उम्मीद करते हैं, उससे मेल नहीं खा सकते हैं, उदाहरण के लिए:

c(1,1,1,1) >= 1
[1] TRUE TRUE TRUE TRUE
c(1,1,1,1) >= c(1,2)
[1]  TRUE FALSE  TRUE FALSE

आपको या तो y के ऊपर लूप की आवश्यकता है, या findInterval का उपयोग करें:

findInterval(y,cumsum(x))+1
[1]  8 11 13 13

आप 1 जोड़ते हैं क्योंकि findInterval आपको यह स्थिति देता है कि आपका मान अंतिम के बराबर या उससे अधिक है।

3
James 13 सितंबर 2018, 17:37

क्या यह समाधान उचित है?

sapply(y, function(i) which.max(cumsum(x) >= i)) 
0
89_Simple 13 सितंबर 2018, 17:42