【问题标题】:simple expansion of rows in data.table by group IDs按组 ID 对 data.table 中的行进行简单扩展
【发布时间】:2021-03-07 19:21:40
【问题描述】:

对于以下给定的数据集:

> df <- data.table(ID=LETTERS[1:4],y_min=c(1970,1973,1976,1971),y_max=c(1974,1975,1980,1974))
> df
   ID y_min y_max
1:  A  1970  1974
2:  B  1973  1975
3:  C  1976  1980
4:  D  1971  1974

ID代表企业ID,y_min和y_max是企业数据出现在数据集中的第一年和最后一年。

如何通过创建一个包含最小和最大年份之间的所有年份的新列“年”来扩展行(按每个公司),因此生成以下内容:

> df
    ID y_min y_max year
 1:  A  1970  1974 1970
 2:  A  1970  1974 1971
 3:  A  1970  1974 1972
 4:  A  1970  1974 1973
 5:  A  1970  1974 1974
 6:  B  1973  1975 1973
 7:  B  1973  1975 1974
 8:  B  1973  1975 1975
 9:  C  1976  1980 1976
10:  C  1976  1980 1977
11:  C  1976  1980 1978
12:  C  1976  1980 1979
13:  C  1976  1980 1980
14:  D  1971  1974 1971
15:  D  1971  1974 1972
16:  D  1971  1974 1973
17:  D  1971  1974 1974

提前致谢!

【问题讨论】:

    标签: r data.table grouping


    【解决方案1】:

    一种选择是通过对“ID”列进行分组来创建list 列,然后在“y_min”、“y_max”和unnest 之间执行:(来自tidyr)@987654325 @专栏

    library(data.table)
    library(tidyr)
    df[, year := .(list(y_min:y_max)), ID]
    df %>%
        unnest(c(year))
    

    -输出

    # A tibble: 17 x 4
    #   ID    y_min y_max  year
    #   <chr> <dbl> <dbl> <int>
    # 1 A      1970  1974  1970
    # 2 A      1970  1974  1971
    # 3 A      1970  1974  1972
    # 4 A      1970  1974  1973
    # 5 A      1970  1974  1974
    # 6 B      1973  1975  1973
    # 7 B      1973  1975  1974
    # 8 B      1973  1975  1975
    # 9 C      1976  1980  1976
    #10 C      1976  1980  1977
    #11 C      1976  1980  1978
    #12 C      1976  1980  1979
    #13 C      1976  1980  1980
    #14 D      1971  1974  1971
    #15 D      1971  1974  1972
    #16 D      1971  1974  1973
    #17 D      1971  1974  1974
    

    或者只使用data.table

    df[, year := Map(`:`, y_min, y_max)]
    df[rep(seq_len(.N), lengths(year))][, year := unlist(df$year)][]
    

    -输出

    #     ID y_min y_max year
    # 1:  A  1970  1974 1970
    # 2:  A  1970  1974 1971
    # 3:  A  1970  1974 1972
    # 4:  A  1970  1974 1973
    # 5:  A  1970  1974 1974
    # 6:  B  1973  1975 1973
    # 7:  B  1973  1975 1974
    # 8:  B  1973  1975 1975
    # 9:  C  1976  1980 1976
    #10:  C  1976  1980 1977
    #11:  C  1976  1980 1978
    #12:  C  1976  1980 1979
    #13:  C  1976  1980 1980
    #14:  D  1971  1974 1971
    #15:  D  1971  1974 1972
    #16:  D  1971  1974 1973
    #17:  D  1971  1974 1974
    

    或自加入

    df[df, .(y_min, y_max, year = y_min:y_max), on = .(ID), by = .EACHI]
    

    【讨论】:

    • 谢谢!您是否认为可能有一个纯粹的 data.table 解决方案,也许通过使用 CJ?
    • @lovestacksflow 用 data.table 解决方案更新了帖子
    猜你喜欢
    • 2016-06-13
    • 2021-05-10
    • 2012-09-10
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多