निम्नानुसार सरलीकृत डेटा/कोड के साथ मेरी पाइपलाइन को पुन: पेश करने का प्रयास किया:
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
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()
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)