группировка месяцев по зимнему сезону вместо года в R - PullRequest
0 голосов
/ 17 мая 2018

У меня есть следующий фрейм данных

year <- c(1949, 1950, 1950, 1950, 1951, 1951, 1951, 1952, 1952, 1952, 1953, 1953, 1953)
month <- c(12, 1, 2, 12, 1, 2, 12, 1, 2, 12, 1, 2, 12)
df <- data.frame(year, month)
 df
   year month
1  1949    12
2  1950     1
3  1950     2
4  1950    12
5  1951     1
6  1951     2
7  1951    12
8  1952     1
9  1952     2
10 1952    12
11 1953     1
12 1953     2
13 1953    12

, где месяц 1 - январь, а месяц 12 - декабрь.сейчас я бы хотел сгруппировать их по зимнему сезону.это будет означать, что, например, 12-й месяц 1949 года будет сгруппирован с 1-м и 2-м месяцем 1950 года, поскольку они являются частью 1 зимнего сезона.идеальный результат будет:

 year month winterseason
1  1949    12            1
2  1950     1            1
3  1950     2            1
4  1950    12            2
5  1951     1            2
6  1951     2            2
7  1951    12            3
8  1952     1            3
9  1952     2            3
10 1952    12            4
11 1953     1            4
12 1953     2            4
13 1953    12            5 

есть идеи?

Ответы [ 4 ]

0 голосов
/ 17 мая 2018

Это будет обозначать каждый сезон объектом класса yearqtr с указанием года и квартала последнего месяца каждой зимы.Мы конвертируем год и месяц в объект класса "yearmon" и добавляем 1/12, который переводит каждый месяц в следующий месяц.Затем преобразуйте его в объект класса "yearqtr".

library(zoo)

transform(df, season = as.yearqtr(as.yearmon(paste(year, month, sep = "-")) + 1/12))

, получив:

   year month  season
1  1949    12 1950 Q1
2  1950     1 1950 Q1
3  1950     2 1950 Q1
4  1950    12 1951 Q1
5  1951     1 1951 Q1
6  1951     2 1951 Q1
7  1951    12 1952 Q1
8  1952     1 1952 Q1
9  1952     2 1952 Q1
10 1952    12 1953 Q1
11 1953     1 1953 Q1
12 1953     2 1953 Q1
13 1953    12 1954 Q1

Обратите внимание, что если season - это переменная, содержащая значения столбца season, то as.integer(season) и cycle(season) можно использовать для извлечения чисел года и квартала, так что, например, если бы были и не зимние строки, то cycle(season) == 1 идентифицировал бы их зимой.

0 голосов
/ 17 мая 2018

Вот альтернатива: использование magrittr и data.table

df$winterYear <- ifelse(month %in% c(11,12),year+1,year) %>% data.table::rleidv()

результат:

   year month winterYear
1  1949    12          1
2  1950     1          1
3  1950     2          1
4  1950    12          2
5  1951     1          2
6  1951     2          2
7  1951    12          3
8  1952     1          3
9  1952     2          3
10 1952    12          4
11 1953     1          4
12 1953     2          4
13 1953    12          5

Примечание: для сохранения вы можете / должны отсортировать данные по year,month.

0 голосов
/ 17 мая 2018

Если это уже организовано к месяцу

df$winterseason <- cumsum(df$month == 12)
df$winterseason
#[1] 1 1 1 2 2 2 3 3 3 4 4 4 5
0 голосов
/ 17 мая 2018

Попробуйте

year <- c(1949, 1950, 1950, 1950, 1951, 1951, 1951, 1952, 1952, 1952, 1953, 1953, 1953)
month <- c(12, 1, 2, 12, 1, 2, 12, 1, 2, 12, 1, 2, 12)
df <- data.frame(year, month)
df$season <- ifelse(month == 12,year+1,year) - min(year)

Это не очень элегантно, но дает идеальный результат

   year month season
1  1949    12      1
2  1950     1      1
3  1950     2      1
4  1950    12      2
5  1951     1      2
6  1951     2      2
7  1951    12      3
8  1952     1      3
9  1952     2      3
10 1952    12      4
11 1953     1      4
12 1953     2      4
13 1953    12      5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...