निम्नानुसार सरलीकृत डेटा/कोड के साथ मेरी पाइपलाइन को पुन: पेश करने का प्रयास किया:

library(magrittr)
library(dplyr)
library(lubridate)

df <- data.frame(
    date = c(
        as.Date("2015-1-1")
        , as.Date("2015-2-1")
        , as.Date("2015-3-1")
        , as.Date("2015-4-1")
        , as.Date("2015-5-1")
        , as.Date("2015-6-1")

        , as.Date("2015-1-1")
        , as.Date("2015-2-1")
        , as.Date("2015-3-1")
        , as.Date("2015-4-1")
        , as.Date("2015-5-1")
        , as.Date("2015-6-1")

    )
    ,value = c(1,2,3,4,5,6 ,7,8,9,10,11,12)
    ,category = as.factor(c("cat1","cat1","cat1","cat1","cat1","cat1"  ,"cat2","cat2","cat2","cat2","cat2","cat2"))
) %>%
group_by(
    date = floor_date(date, unit = "monthly")
    ,category 
) %>%
summarise(
    value = min(value)
) %>%
mutate(
    month_minus_1 = lag(value, n=1)
    , month_minus_2 = lag(value, n=2)
) %>%
arrange(
    category 
    , value
)
df

मैंने यह इंगित करने के लिए फ़्लोर_डेट जोड़ा कि मैं महीने के हिसाब से कुछ आंकड़े रोलअप करूँगा और कुछ आँकड़ों का उपयोग करूँगा (यहाँ न्यूनतम)। वैसे भी, मैं प्रत्येक समूह में अंतराल कैसे लागू कर सकता हूं क्योंकि उपरोक्त परिणाम गलत हैं:

date category value month_minus_1 month_minus_2
2015-01-01  cat1    1   NA  NA
2015-02-01  cat1    2   NA  NA
2015-03-01  cat1    3   NA  NA
2015-04-01  cat1    4   NA  NA
2015-05-01  cat1    5   NA  NA
2015-06-01  cat1    6   NA  NA
2015-01-01  cat2    7   1   NA
2015-02-01  cat2    8   2   NA
2015-03-01  cat2    9   3   NA
2015-04-01  cat2    10  4   NA
2015-05-01  cat2    11  5   NA
2015-06-01  cat2    12  6   NA

अपेक्षित उत्पादन:

 date category value month_minus_1 month_minus_2
    2015-01-01  cat1    1   NA  NA
    2015-02-01  cat1    2   1   NA
    2015-03-01  cat1    3   2   1
    2015-04-01  cat1    4   3   2
    2015-05-01  cat1    5   4   3
    2015-06-01  cat1    6   5   4
    2015-01-01  cat2    7   NA  NA
    2015-02-01  cat2    8   7   NA
    2015-03-01  cat2    9   8   7
    2015-04-01  cat2    10  9   8
    2015-05-01  cat2    11  10  9
    2015-06-01  cat2    12  11  10
r
1
cs0815 3 अप्रैल 2020, 18:35
कृपया अपना अपेक्षित आउटपुट प्रदान करें।
 – 
Darren Tsai
3 अप्रैल 2020, 18:51
- क्षमा करें सोचा कि यह स्पष्ट था ...
 – 
cs0815
3 अप्रैल 2020, 18:58

2 जवाब

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

संक्षिप्त उत्तर यह है कि date dplyr::group_by() के अंदर नहीं होना चाहिए।

dplyr::group_by() अलग-अलग मिनी-डेटा.फ़्रेम बनाता है जो dplyr::lag() जैसे कार्य करते हैं जिन्हें बाहर नहीं देखा जा सकता है। तो अनिवार्य रूप से आप बारह डेटा बना रहे थे। एक पंक्ति के साथ फ्रेम।

library(magrittr)
library(dplyr)
library(lubridate)

data.frame(
  date = as.Date(c(
    "2015-01-01", "2015-02-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-06-01", 
    "2015-01-01", "2015-02-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-06-01" 
  )),
  value = c(1,2,3,4,5,6 ,7,8,9,10,11,12),
  category = as.factor(c("cat1","cat1","cat1","cat1","cat1","cat1"  ,"cat2","cat2","cat2","cat2","cat2","cat2"))
) %>% 
group_by(category) %>%
mutate(
  month_minus_1 = lag(value, n=1, order_by = date),
  month_minus_2 = lag(value, n=2, order_by = date)
) %>%
ungroup() 

परिणाम:

# A tibble: 12 x 5
   date       value category month_minus_1 month_minus_2
   <date>     <dbl> <fct>            <dbl>         <dbl>
 1 2015-01-01     1 cat1                NA            NA
 2 2015-02-01     2 cat1                 1            NA
 3 2015-03-01     3 cat1                 2             1
 4 2015-04-01     4 cat1                 3             2
 5 2015-05-01     5 cat1                 4             3
 6 2015-06-01     6 cat1                 5             4
 7 2015-01-01     7 cat2                NA            NA
 8 2015-02-01     8 cat2                 7            NA
 9 2015-03-01     9 cat2                 8             7
10 2015-04-01    10 cat2                 9             8
11 2015-05-01    11 cat2                10             9
12 2015-06-01    12 cat2                11            10

मैं देखता हूं कि आप अपने वास्तविक परिदृश्य में कुछ सारांशित करना चाहते हैं (यहां आपके द्वारा प्रस्तुत सरलीकृत परिदृश्य नहीं)। मैं ऐसा कुछ करूंगा, जहां अंतराल के लिए सबसेट करने से पहले फर्श और स्टेट की गणना की जाती है। वह पहला dplyr::ungroup() आवश्यक नहीं है, लेकिन मुझे यह पसंद है कि यह कैसे इरादे को बेहतर तरीके से संप्रेषित करता है।

data.frame(
  date = as.Date(c(
    "2015-01-01", "2015-02-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-06-01", 
    "2015-01-01", "2015-02-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-06-01" 
  )),
  value = c(1,2,3,4,5,6 ,7,8,9,10,11,12),
  category = as.factor(c("cat1","cat1","cat1","cat1","cat1","cat1"  ,"cat2","cat2","cat2","cat2","cat2","cat2"))
) %>%
dplyr::mutate(
  month_floor = floor_date(date, unit = "monthly")
) %>%
group_by(category, month_floor) %>%
summarize(
  value_mean   = mean(value) # Or the rollup statistic you're referring to.
) %>% 
ungroup() %>% 
group_by(category) %>%
mutate(
  month_minus_1 = lag(value_mean, n=1, order_by = month_floor),
  month_minus_2 = lag(value_mean, n=2, order_by = month_floor)
) %>%
ungroup() 
1
wibeasley 3 अप्रैल 2020, 18:58
1
कमाल है - मुझे रोलमीन + रोलमेडियन के साथ भी ऐसी ही समस्या थी
 – 
cs0815
3 अप्रैल 2020, 19:13

summarize समूहीकरण की एक 'परत' को हटा देता है। तो संक्षेप के बाद आपके पास केवल date द्वारा समूहीकृत एक df है, जबकि आप श्रेणी के आधार पर एक समूह चाहते हैं।

बस दो ग्रुपिंग वर्र्स को स्विच करने से आपको वह मिलता है जो आपको चाहिए:

library(magrittr)
library(dplyr)
library(lubridate)

df %>%
  group_by(category,
           date = floor_date(date, unit = "monthly")
           ) %>%
  summarise(value = min(value)) %>%
  mutate(month_minus_1 = lag(value, n = 1),
         month_minus_2 = lag(value, n = 2)) %>%
  arrange(category,
          value)

#> # A tibble: 12 x 5
#> # Groups:   category [2]
#>    category date       value month_minus_1 month_minus_2
#>    <fct>    <date>     <dbl>         <dbl>         <dbl>
#>  1 cat1     2015-01-01     1            NA            NA
#>  2 cat1     2015-02-01     2             1            NA
#>  3 cat1     2015-03-01     3             2             1
#>  4 cat1     2015-04-01     4             3             2
#>  5 cat1     2015-05-01     5             4             3
#>  6 cat1     2015-06-01     6             5             4
#>  7 cat2     2015-01-01     7            NA            NA
#>  8 cat2     2015-02-01     8             7            NA
#>  9 cat2     2015-03-01     9             8             7
#> 10 cat2     2015-04-01    10             9             8
#> 11 cat2     2015-05-01    11            10             9
#> 12 cat2     2015-06-01    12            11            10

2020-04-03 को reprex पैकेज द्वारा बनाया गया (v0.3.0)

1
GGamba 3 अप्रैल 2020, 19:01
धन्यवाद। यह काम। मुझे नहीं पता था कि आदेश बिल्कुल भी मायने रखता है! मुझे यकीन नहीं है कि मैं आपका पहला जवाब स्वीकार कर सकता हूं - देखें कि विबेस्ली नीचे क्या कहता है ...
 – 
cs0815
3 अप्रैल 2020, 19:09
यह बिल्कुल वैसा ही है, शायद कम स्पष्ट, लेकिन मुझे लगता है कि यह स्पष्ट है। यह किसी भी संक्षेपण को ध्यान में रखता है जिसे आप करना चाहते हैं
 – 
GGamba
3 अप्रैल 2020, 19:15
काफी उचित धन्यवाद। हालांकि, रोलमीन + रोलमेडियन पर लागू होने पर यह काम नहीं करता था। मुझे पता है कि यह सवाल नहीं है। हालांकि, स्पष्ट दृष्टिकोण काम करता है। तो सुनिश्चित नहीं हैं कि आप जो कहते हैं वह सामान्य है?
 – 
cs0815
3 अप्रैल 2020, 19:18