Наблюдения за `` группирующим '' фактором в R - PullRequest
1 голос
/ 27 мая 2020

У меня есть фрейм данных, структура которого похожа на этот

Year <- c("2000", "2001", "2002" ,"2003", "2004", "2005" ,"2006", "2007", "2008", "2009", "2010", "2011" ,"2012", "2013", "2014", "2015")
Sales <- c(2000,4800,6700,5000,7000,8000,3070,2000,1800,7100,6600,5000,6000,4200,1200,5700)
salesDF <- data.frame(Year,Sales)

Столбец Year является факторной переменной. Я хотел бы изменить новый столбец, в котором есть наблюдения в столбце «Год», сгруппированные с интервалом в 5 лет. Так что в конечном итоге тренд продаж кратен пятилетним интервалам.

Я бы хотел, чтобы в моей легенде были интервалы "2000", "2005", "2010", "2015"

Как мне go достичь этого?

Ответы [ 3 ]

6 голосов
/ 27 мая 2020

Вот простой подход к группировке с cumsum и модулем (%%):

salesDF %>% 
  mutate(Group = cumsum(as.numeric(as.character(salesDF$Year)) %% 5 == 0)) %>%
  group_by(Group) %>%
  summarize(Year = first(Year), Mean = mean(Sales), Sum = sum(Sales))
# A tibble: 4 x 4
  Group Year   Mean   Sum
  <int> <fct> <dbl> <dbl>
1     1 2000   5100 25500
2     2 2005   4394 21970
3     3 2010   4600 23000
4     4 2015   5700  5700

Или как новый столбец без обобщения:

salesDF %>% 
  mutate(Group = cumsum(as.numeric(as.character(salesDF$Year)) %% 5 == 0)) %>%
  group_by(Group) %>%
  mutate(Mean = mean(Sales), Sum = sum(Sales))
# A tibble: 16 x 5
# Groups:   Group [4]
   Year  Sales Group  Mean   Sum
   <fct> <dbl> <int> <dbl> <dbl>
 1 2000   2000     1  5100 25500
 2 2001   4800     1  5100 25500
 3 2002   6700     1  5100 25500
...
14 2013   4200     3  4600 23000
15 2014   1200     3  4600 23000
16 2015   5700     4  5700  5700
3 голосов
/ 27 мая 2020

Вы можете использовать cut / findInterval для разделения данных на группы по 5 лет.

library(dplyr)

salesDF %>%
  group_by(grp = findInterval(Year, seq(min(Year), max(Year), 5))) %>%
  summarise(Year = first(Year), Sales = sum(Sales)) %>%
  ungroup() %>%
  select(-grp)

# A tibble: 4 x 2
#  Year  Sales
#  <chr> <dbl>
#1 2000  25500
#2 2005  21970
#3 2010  23000
#4 2015   5700

Или в data.table

library(data.table)
setDT(salesDF)[, .(Year = first(Year), Sales = sum(Sales)), 
                  .(findInterval(Year, seq(min(Year), max(Year), 5)))]

data

Изменение Year столбца на numeri c

salesDF$Year <- as.numeric(as.character(salesDF$Year))
0 голосов
/ 27 мая 2020

Раствор Base R:

agg_sales <- data.frame(do.call("cbind", (aggregate(. ~ Year, 
                       within(salesDF, {Year <- floor(as.numeric(as.character(Year)) %/% 5) * 5}),
                       FUN = function(x) {
                         c(total_sales = sum(x, na.rm = TRUE), avg_sales = mean(x, na.rm = TRUE))}))))
...