使用dplyr在R中按月创建季节变量

4

我有一个数据集,其中有一个名为“month”的变量,每个月都以字符形式呈现。是否可以使用dplyr的方法组合一些月份创建一个季节变量?我尝试了以下代码但是出现了错误:

data %>%
  mutate(season = ifelse(month[1:3], "Winter", ifelse(month[4:6], "Spring", 
                     ifelse(month[7:9], "Summer", 
                            ifelse(month[10:12], "Fall", NA)))))

出现错误:

Error in mutate_impl(.data, dots) : Column `season` must be length 100798 (the number of rows) or one, not 3

我是R语言的新手,非常感谢任何帮助!

3个回答

6
正确的语法应该是:
data %>% mutate(season = ifelse(month %in% 10:12, "Fall",
                               ifelse(month %in% 1:3, "Winter",
                                      ifelse(month %in% 4:6, "Spring",
                                             "Summer"))))

编辑:也许有更好的方法完成任务。

天文季节

temp_data %>%
  mutate(
    season = case_when(
      month %in% 10:12 ~ "Fall",
      month %in%  1:3  ~ "Winter",
      month %in%  4:6  ~ "Spring",
      TRUE ~ "Summer"))

气象季节
temp_data %>%
  mutate(
    season = case_when(
      month %in%  9:11 ~ "Fall",
      month %in%  c(12, 1, 2)  ~ "Winter",
      month %in%  3:5  ~ "Spring",
      TRUE ~ "Summer"))

1
谢谢,这个方法可行!我想我对括号的使用感到困惑了! - newbie14
我添加了另一种(更好的)使用case_when的方法来完成它。 - Tung
1
1:3 不是冬季的正确月份,对吧?可能应该像这样:month %in% 9:11 ~ "秋季", month %in% c(1,2,12) ~ "冬季", month %in% 3:5 ~ "春季" - Vasyl Laver
1
@VasylLaver:你所提到的是气象季节。楼主使用的是天文季节的定义。让我把它加到答案中。谢谢! - Tung

4
当有多个键值对时,我们可以使用键值数据集进行连接。
keyval <- data.frame(month = month.abb, 
      season = rep(c("Winter", "Spring", "Summer", "Fall"), each = 3),
      stringsAsFactors = FALSE)

left_join(data, keyval)

1
你也可以尝试使用 dplyr::recodeforcats 中的函数。我认为这是最简单的方法:
library(tidyverse)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date
data <- tibble(month = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))

data %>%
  mutate(
    season = fct_collapse(
      .f = month,
      Spring = c("Mar", "Apr", "May"),
      Summer = c("Jun", "Jul", "Aug"),
      Autumn = c("Sep", "Oct", "Nov"),
      Winter = c("Dec", "Jan", "Feb")
    )
  )
#> # A tibble: 12 x 2
#>    month season
#>    <chr> <fct> 
#>  1 Jan   Winter
#>  2 Feb   Winter
#>  3 Mar   Spring
#>  4 Apr   Spring
#>  5 May   Spring
#>  6 Jun   Summer
#>  7 Jul   Summer
#>  8 Aug   Summer
#>  9 Sep   Autumn
#> 10 Oct   Autumn
#> 11 Nov   Autumn
#> 12 Dec   Winter

此代码示例是由reprex package (v0.2.0)在2018-04-06创建的。


1
有默认的 month.abbmonth.name 变量可供使用,以节省一些打字。 - Tung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接