मेरे पास संख्याओं के लगातार घटने के साथ एक डेटा फ्रेम है और कुछ में कमी और वृद्धि के साथ फिर से कमी (समूहों में) है।

मुझे इस लगातार कमी वाले हिस्से को निकालने और अनियंत्रित वृद्धि और कमी वाले हिस्से को हटाने की जरूरत है!

यहाँ मेरे मतलब का परीक्षण डेटा है

test=data.frame(set=gl(3,9),vals=c(c(10,10,10, 9.9, 8.1, 1, 1,1,1),c(10,10,10, 9.9,6.1,1, 2,1,1),c(10,10,10, 7,6,1,2,0,1)))

> test
   set vals
1    1 10.0
2    1 10.0
3    1 10.0
4    1  9.9
5    1  8.1
6    1  1.0
7    1  1.0
8    1  1.0
9    1  1.0
10   2 10.0
11   2 10.0
12   2 10.0
13   2  9.9
14   2  6.1
15   2  1.0
16   2  2.0
17   2  1.0
18   2  1.0
19   3 10.0
20   3 10.0
21   3 10.0
22   3  7.0
23   3  6.0
24   3  1.0
25   3  2.0
26   3  0.0
27   3  1.0

मैं डेटा में लगातार कमी को खोजने के लिए slice_it नामक सरल फ़ंक्शन लिखता हूं

slice_it <-  function(x){

  temp <- c(0,diff(x))

  }

library(dplyr)
test%>%
  group_by(set)%>%
  mutate(diff_x=slice_it(vals))

जो देता है

  set vals diff_x
1    1 10.0    0.0  #remove
2    1 10.0    0.0  #remove
3    1 10.0    0.0  #remove
4    1  9.9   -0.1  #keep 
5    1  8.1   -1.8  #keep 
6    1  1.0   -7.1  #keep
7    1  1.0    0.0  #remove 
8    1  1.0    0.0  #remove
9    1  1.0    0.0  #remove
10   2 10.0    0.0  #remove
11   2 10.0    0.0  #remove
12   2 10.0    0.0  #remove
13   2  9.9   -0.1  #keep
14   2  6.1   -3.8  #keep
15   2  1.0   -5.1  #keep
16   2  2.0    1.0  #remove
17   2  1.0   -1.0  #remove 
18   2  1.0    0.0  #remove
19   3 10.0    0.0  #remove
20   3 10.0    0.0  #remove
21   3 10.0    0.0  #remove
22   3  7.0   -3.0  #keep
23   3  6.0   -1.0  #keep
24   3  1.0   -5.0  #keep
25   3  2.0    1.0  #remove
26   3  0.0   -2.0  #remove
27   3  1.0    1.0  #remove

अगर मैं dplyr श्रृंखला में फ़िल्टर जोड़ूं जो देता है

filter(diff_x<0)

# A tibble: 11 x 3
# Groups:   set [3]
  set    vals  diff_x
 1 1       9.9 -0.1000 #keep
 2 1       8.1 -1.8    #keep
 3 1       1   -7.1    #keep 
 4 2       9.9 -0.1000 #keep 
 5 2       6.1 -3.8    #keep
 6 2       1   -5.1    #keep 
 7 2       1   -1      #remove
 8 3       7   -3      #keep
 9 3       6   -1      #keep
10 3       1   -5      #keep
11 3       0   -2      #remove

जिन पंक्तियों को मैंने #remove के साथ इंगित किया था, वे अभी भी उनके diff<0 के रूप में बनी हुई हैं। लेकिन यह पिछली संख्या की वृद्धि के बाद हो रहा है इसलिए इसे हटा दिया जाना चाहिए!

अपेक्षित दिखना चाहिए

  set vals diff_x

4    1  9.9   -0.1  #keep 
5    1  8.1   -1.8  #keep 
6    1  1.0   -7.1  #keep
13   2  9.9   -0.1  #keep
14   2  6.1   -3.8  #keep
15   2  1.0   -5.1  #keep
22   3  7.0   -3.0  #keep
23   3  6.0   -1.0  #keep
24   3  1.0   -5.0  #keep

इसे कैसे प्राप्त किया जा सकता है। धन्यवाद!

पुनश्च अंतिम भाग से टुकड़ा मदद नहीं करेगा क्योंकि नीचे से कितनी पंक्तियाँ अनिश्चित हैं।

0
Alexander 29 जून 2018, 00:51

1 उत्तर

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

बशर्ते मैं आपको सही ढंग से समझूं, हम lag ged मानों पर एक दूसरे diff का उपयोग कर सकते हैं; यह आपके अपेक्षित आउटपुट को पुन: पेश करता है

test %>%
    rowid_to_column("row") %>%
    group_by(set) %>%
    mutate(
        diff = c(0, diff(vals)),
        diff2 = c(0, diff(lag(vals)))) %>%
    filter(diff < 0 & diff2 <= 0) %>%
    select(-diff2)
## A tibble: 9 x 4
## Groups:   set [3]
#    row set    vals    diff
#  <int> <fct> <dbl>   <dbl>
#1     4 1      9.90 -0.1000
#2     5 1      8.10 -1.80
#3     6 1      1.00 -7.10
#4    13 2      9.90 -0.1000
#5    14 2      6.10 -3.80
#6    15 2      1.00 -5.10
#7    22 3      7.00 -3.00
#8    23 3      6.00 -1.00
#9    24 3      1.00 -5.00

अद्यतन

अपने slice_it फ़ंक्शन का पुन: उपयोग करने के लिए

slice_it <-  function(x) c(0, diff(x))
test %>%
    group_by(set) %>%
    mutate(diff_x = slice_it(vals)) %>%
    filter(diff_x < 0 & slice_it(lag(vals)) <= 0)
1
Maurits Evers 29 जून 2018, 01:46