【问题标题】:grouping months by winter season instead of year in R在R中按冬季而不是年份分组月份
【发布时间】:2018-10-27 09:19:12
【问题描述】:

我有以下数据框

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 个月是 1 月,第 12 个月是 12 月。现在我想按冬季对它们进行分组。这意味着例如 1949 年的第 12 个月将与 1950 年的第 1 个月和第 2 个月分组,因为它们是 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 

有什么想法吗?

【问题讨论】:

  • 除了 12、1 和 2 之外还有其他月份吗?此外,它们总是按顺序排列吗?我的意思是12、1、2、12、1、2.....?
  • 在你的现实生活中的数据也总是c(12,1,2)?那么你可以简单地尝试gl(nrow(df)/3,3)
  • 在现实生活中的数据中,它的 c(11,12,1,2) 也是 11 月 :) 并且总是按顺序排列
  • 那么你想要 11 的 winterseason 列的值是多少?您能否在示例中添加 November(11) 并更新预期输出,使其更清晰。

标签: r


【解决方案1】:

如果这是按月安排的

df$winterseason <- cumsum(df$month == 12)
df$winterseason
#[1] 1 1 1 2 2 2 3 3 3 4 4 4 5

【讨论】:

    【解决方案2】:

    这将通过 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,将识别那些在冬天。

    【讨论】:

      【解决方案3】:

      试试

      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
      

      【讨论】:

      • 这很好用,谢谢。也适用于额外的 11 个月
      【解决方案4】:

      这是一种替代方法:使用 magrittrdata.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 对数据进行排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-04
        • 1970-01-01
        • 1970-01-01
        • 2016-11-07
        • 1970-01-01
        相关资源
        最近更新 更多