Использование функции mutate в R для преобразования чисел месяцев в сезонах - PullRequest
0 голосов
/ 30 января 2019

немного неловкого вопроса новичка здесь.

Как преобразовать данные из списка месяцев в сезоны.

winter = c(12, 1, 2), 
spring = c(3, 4, 5)
summer = c(6, 7, 8)
autumn = c(9, 10, 11)
movies.lm <- mutate(movies.lm, thtr_season = if(thtr_rel_month %in% "winter",  "winter"), (thtr_rel_month %in% "spring", "spring"), (thtr_rel_month %in% "summer", "summer"), (thtr_rel_month %in% "autumn", "autumn)

Это, естественно, возвращает стек восхитительных ошибок.

Кто-нибудь знает, как сделать то, что я пытаюсь сделать здесь, в R?

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Поскольку сезонные месяцы являются смежными, это хорошая работа для функции cut:

months <- c(1,1,1,2,3,4,5,6,7,8,8,9,11,12)

seasons <- c("Winter", "Spring", "Summer", "Autumn")
indx <- cut(months %% 12, # send 12 to 0
            seq(0, 12, 3), # cut into three month cycles
            labels = F, # return index
            include.lowest = T, # include lower bounds (0, 3, 6, 9)
            right = F # exclude upper bounds (3, 6, 9, 12)
)

seasons[indx]

# [1] "Winter" "Winter" "Winter" "Winter" "Spring" "Spring" "Spring" "Summer"
# [9] "Summer" "Summer" "Summer" "Autumn" "Autumn" "Winter"

cut с labels = F создает индекс, который позволяет вам подмножествовать символьный вектор season.

0 голосов
/ 30 января 2019
library(dplyr)

seasons <- c("Winter", "Spring", "Summer", "Autumn")

movies.lm <- data.frame(thtr_rel_month=c(1,7,5,2,12,11,6,3,8,4,5,10,9))

movies.lm <- mutate(movies.lm, thtr_season = seasons[cut((thtr_rel_month%%12)+1, breaks=4)])

movies.lm
#>    thtr_rel_month thtr_season
#> 1               1      Winter
#> 2               7      Summer
#> 3               5      Spring
#> 4               2      Winter
#> 5              12      Winter
#> 6              11      Autumn
#> 7               6      Summer
#> 8               3      Spring
#> 9               8      Summer
#> 10              4      Spring
#> 11              5      Spring
#> 12             10      Autumn
#> 13              9      Autumn

Создано в 2019-01-30 пакетом представ (v0.2.1)

0 голосов
/ 30 января 2019

Вы можете использовать красивую естественную структуру ifelse:

months <- c(1,1,1,2,3,4,5,6,7,8,8,9,11,12)
movies.lm <- data.frame(months)
movies.lm$season <- ifelse(months==12 | months==1 | months==2, "Winter", 
                           ifelse(months==3 | months==4 | months==5, "Spring", 
                                  ifelse(months==6 | months==7 | months==8, "Summer",
                                         ifelse(months==9 | months==10 | months==11, "Autumn", 
                                                NA)))) 
>movies.lm
   months season
1       1 Winter
2       1 Winter
3       1 Winter
4       2 Winter
5       3 Spring
6       4 Spring
7       5 Spring
8       6 Summer
9       7 Summer
10      8 Summer
11      8 Summer
12      9 Autumn
13     11 Autumn
14     12 Winter

mutant может быть более элегантной в некоторых ситуациях, особенно при работе с большими данными, однако в простых случаях я бы предпочел простойрешения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...