2015-12-14 5 views
10

मैं बार-बार लोगों को दूर लेकिन एक द्विआधारी वेक्टर में पहली रखने के लिए करना चाहते हैं:आर: दोहराया मूल्यों निकालें और एक द्विआधारी वेक्टर में पहली एक रखने

x = c(0,0,1,1,0,1,0,1,1,1,0,1) # the input 
y = c(0,0,1,0,1,0,1,0,1)  # the desired output 

यानी, एक 1 और दो 1 की 1 के पहले और तीसरे सेट को क्रमशः हटा दिया गया है, और सेट में पहला रखा गया है।

मैं cumsum के साथ उपयोग करने की कोशिश कर रहा हूं लेकिन अभी तक इसे अभी तक नहीं समझ पाया है। किसी भी सुझाव का स्वागत है।

+2

यहाँ एक और एक 'एक्स है [एवेन्यू (एक्स, cumsum (एक्स == 0), मज़ा = cumsum) <= 1]' – rawr

उत्तर

8

का उपयोग rle/inverse.rle

res <- rle(x) 
res$lengths[res$values == 1] <- 1 
inverse.rle(res) 
## [1] 0 0 1 0 1 0 1 0 1 
+1

या 'inverse.rle (भीतर (unclass (RLE (x)), लंबाई [मान == 1] <- 1)) 'इसे एक लाइनर बनाने के लिए। – nicola

+0

@nicola हाँ मैं इसे एक लाइनर बनाने के बारे में सोच रहा था लेकिन '(rle (x), लंबाई [मान == 1] <- 1) के साथ' करने का प्रयास कर रहा था 'जो किसी कारण से काम नहीं करता है। 'Unclass' के साथ 'भीतर' का उपयोग करना पढ़ने के लिए मुश्किल लगता है। –

+1

पता नहीं था कि एक व्यस्त है, बढ़िया! – Francis

8

हम diff उपयोग कर सकते हैं:

x[c(1, diff(x)) == 1 | x == 0] 
+1

यदि कोई डेटा फ्रेम को सब्सक्राइब करना चाहता है, तो वेक्टर को कॉलम में से एक होने पर सूचकांक रखना बहुत ही बढ़िया है। बहुत बहुत धन्यवाद! – Francis

1
x = c(0,0,1,1,0,1,0,1,1,1,0,1) 
x1 <- rle(x) 
x1$lengths[x1$values==1] <- 1 
inverse.rle(x1) 
+0

यह वह संस्करण था जिसे मैं पोस्ट करने वाला था। – Therkel

+0

@ डेविड एरिनबर्ग तेज –

4
x = c(0,0,1,1,0,1,0,1,1,1,0,1) 
x[!(x == 1 & #remove each value that is a 1 
    c(x[-1] == 1, FALSE) #followed by a 1 (never the case for the last value) 
)] 
#[1] 0 0 1 0 1 0 1 0 1 
+0

यह मेरे उत्तर से स्पष्ट रूप से अधिक संक्षिप्त है। क्या आप समझा सकते हैं कि यह कैसे काम करता है? –

+0

@ ब्रेंटमुलिनिक्स मैंने टिप्पणी जोड़ दी है। – Roland

+0

आपके पास वेक्टर सी (x [-1] == 1, FALSE) क्यों है? एक्स [! (X == 1 और x [-1] == 1)] करने से क्या अंतर है? –

0

वेक्टर आकार आप इसे माध्यम से लूप सकता है पर निर्भर करता है और मूल्य जोड़कर के लिए शर्तों का उपयोग परिणाम के लिए। आपके दिए गए इनपुट का उपयोग करके यहां एक सरल समाधान है।

x <- c(0,0,1,1,0,1,0,1,1,1,0,1) 
prev <- 0 
y <- c() 
for(i in x){ 
    if (i == 1){ 
    if (prev != 1){ 
     y <- append(y,i) 
    } 
    }else{ 
    y <- append(y,i) 
    } 
    prev <- i 
} 
+3

कभी भी एक लूप में ऑब्जेक्ट नहीं बढ़ाना। कृपया पढ़ें [आर इन्फर्नो] (http://www.burns-stat.com/pages/Tutor/R_inferno.pdf)। – Roland

+0

सलाह के लिए धन्यवाद। @Roland –

संबंधित मुद्दे