【问题标题】:How to restructure event data to dyadic in R如何在R中将事件数据重组为二元
【发布时间】:2022-01-23 23:01:09
【问题描述】:

我的数据如下所示:

ID  Year 
1   1990
2   1990
3   1991
4   1992
5   1995

我想为每个观察添加六个国家(假设国家 A、B、C、D、E、F)。总共,我将有 30 个观察结果。所以我希望数据是这样的:

    ID  Year    Country
    1    1990     A
    1    1990     B
    1    1990     C
    1    1990     D
    1    1990     E
    1    1990     F
    2    1990     A
    2    1990     B
    2    1990     C
    2    1990     D
    2    1990     E
    2    1990     F
    3    1991     A
    3    1991     B
    3    1991     C
    3    1991     D
    3    1991     E
    3    1991     F
    4    1992     A
    4    1992     B
    4    1992     C
    4    1992     D
    4    1992     E
    4    1992     F
    5    1995     A
    5    1995     B
    5    1995     C
    5    1995     D
    5    1995     E
    5    1995     F

【问题讨论】:

    标签: r


    【解决方案1】:

    基础R:

    countries <- LETTERS[1:6] # whatever you really have as a vector
    out <- merge(dat, data.frame(Country = countries), by = NULL)
    out[c(1:3, 28:30),]
    #    ID Year Country
    # 1   1 1990       A
    # 2   2 1990       A
    # 3   3 1991       A
    # 28  3 1991       F
    # 29  4 1992       F
    # 30  5 1995       F
    

    请注意,这适用于 data.frametbl_df,但 data.table::merge 不允许 by=NULL 进行笛卡尔扩展。


    数据

    dat <- structure(list(ID = 1:5, Year = c(1990L, 1990L, 1991L, 1992L, 1995L)), class = "data.frame", row.names = c(NA, -5L))
    

    【讨论】:

      【解决方案2】:

      我们可以使用crossing

      library(tidyr)
      crossing(df1, Country = LETTERS[1:6])
      

      -输出

      # A tibble: 30 × 3
            ID  Year Country
         <int> <int> <chr>  
       1     1  1990 A      
       2     1  1990 B      
       3     1  1990 C      
       4     1  1990 D      
       5     1  1990 E      
       6     1  1990 F      
       7     2  1990 A      
       8     2  1990 B      
       9     2  1990 C      
      10     2  1990 D      
      # … with 20 more rows
      

      或者使用base Rrep

      out <- cbind(df1[rep(seq_len(nrow(df1)), each = 6),], Country = LETTERS[1:6])
      

      数据

      df1 <- structure(list(ID = 1:5, Year = c(1990L, 1990L, 1991L, 1992L, 
      1995L)), class = "data.frame", row.names = c(NA, -5L))
      

      【讨论】:

      • 感谢您的回答。还有一个问题。我有真实的国名。我需要用什么代替LETTERS[1:6]?
      • @Santiago99 你传递了一个向量,即c("A", "B", "C", "D", "E", "F")
      • @Santiago99 如果可行,请考虑单击勾选标记接受解决方案。谢谢
      猜你喜欢
      • 1970-01-01
      • 2017-08-10
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      相关资源
      最近更新 更多