【问题标题】:Group variable based on continuous values基于连续值的分组变量
【发布时间】:2018-10-04 10:28:01
【问题描述】:

我有这样一个带有年度数据的数据框,但是,有些年份没有数据(这里:1956、1961-1964)。

dat <- data.frame(Year = c(1950:1955, 1957:1960, 1965:1970),
                  Val = 1:16)
> dat
   Year Val
1  1950   1
2  1951   2
3  1952   3
4  1953   4
5  1954   5
6  1955   6
7  1957   7
8  1958   8
9  1959   9
10 1960  10
11 1965  11
12 1966  12
13 1967  13
14 1968  14
15 1969  15
16 1970  16

我想添加一个变量“Period”,其中包含每个时期的最小和最大年份,其中一个时期被定义为一组连续的年份(即 1950-1955、1957-1960 和 1965-1970)。创建这个变量本身不是问题,但我被困在如何进行分组上。有什么想法吗?

dat %>%
  ...???... %>%
  mutate(Period = paste(min(Year), max(Year), sep = "-"))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以为连续期间创建一个 ID:

    dat$cont_per <- cumsum(!c(TRUE, diff(dat$Year)==1))
    

    然后据此计算最小值/最大值。例如,:

    library(data.table)
    setDT(dat)
    dat[, Period := paste(min(Year), max(Year), sep="-"), by=cont_per]
     dat
        # Year Val cont_per    Period
     # 1: 1950   1        0 1950-1955
     # 2: 1951   2        0 1950-1955
     # 3: 1952   3        0 1950-1955
     # 4: 1953   4        0 1950-1955
     # 5: 1954   5        0 1950-1955
     # 6: 1955   6        0 1950-1955
     # 7: 1957   7        1 1957-1960
     # 8: 1958   8        1 1957-1960
     # 9: 1959   9        1 1957-1960
    # 10: 1960  10        1 1957-1960
    # 11: 1965  11        2 1965-1970
    # 12: 1966  12        2 1965-1970
    # 13: 1967  13        2 1965-1970
    # 14: 1968  14        2 1965-1970
    # 15: 1969  15        2 1965-1970
    # 16: 1970  16        2 1965-1970
    

    注意:您也可以直接计算Period,而无需创建变量cont_per

    setDT(dat)[, Period := paste(min(Year), max(Year), sep="-"), by=cumsum(!c(TRUE, diff(Year)==1))]
    head(dat)
    #    Year Val    Period
    # 1: 1950   1 1950-1955
    # 2: 1951   2 1950-1955
    # 3: 1952   3 1950-1955
    # 4: 1953   4 1950-1955
    # 5: 1954   5 1950-1955
    # 6: 1955   6 1950-1955
    

    同样,:

    dat %>% 
       group_by(count_per=cumsum(!c(TRUE, diff(dat$Year)==1))) %>% 
       mutate(Period=paste(min(Year), max(Year), sep="-"))
    

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      相关资源
      最近更新 更多