【问题标题】:Identify and group across observations跨观察识别和分组
【发布时间】:2019-03-06 22:04:05
【问题描述】:

我如何识别和生成一个新变量来识别哪些观察属于不同的组。假设我有以下数据集:

ID | country  |  side  
1  |  arg     |  1
1  |  usa     |  0
2  |  ita     |  1
2  |  usa     |  0
2  |  uk      |  1
3  |  aus     |  0
3  |  uk      |  1

并且我想创建一个新变量 (sideUK) 来标识国家“uk”是否参与了每个国家/地区的 ID 和 side。例如,这将是:

ID | country  |  side  | sideuk
1  |  arg     |  1     |  0
1  |  usa     |  0     |  0
2  |  ita     |  1     |  1
2  |  usa     |  0     |  0
2  |  uk      |  1     |  1
3  |  aus     |  0     |  0
3  |  uk      |  1     |  1

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我不完全确定您在追求什么,但以下内容重现了您的预期输出

    library(dplyr)
    df %>%
        group_by(ID) %>%
        mutate(sideuk = +("uk" %in% country & side == 1)) %>%
        ungroup()
    ## A tibble: 7 x 4
    #     ID country  side sideuk
    #  <int> <fct>   <int>  <int>
    #1     1 arg         1      0
    #2     1 usa         0      0
    #3     2 ita         1      1
    #4     2 usa         0      0
    #5     2 uk          1      1
    #6     3 aus         0      0
    #7     3 uk          1      1
    

    样本数据

    df <- read.table(text =
        "ID  country    side
    1    arg       1
    1    usa       0
    2    ita       1
    2    usa       0
    2    uk        1
    3    aus       0
    3    uk        1", header = T)
    

    【讨论】:

      【解决方案2】:

      您想按 ID 分组,然后在 country 变量中检查 'uk'

      df %>%
          group_by(ID, side) %>%
          mutate(sideuk = as.integer('uk' %in% country))
      
      # A tibble: 7 x 4
      # Groups:   ID, side [6]
           ID country  side sideuk
        <dbl> <fct>   <dbl>  <int>
      1     1 arg         1      0
      2     1 usa         0      0
      3     2 ita         1      1
      4     2 usa         0      0
      5     2 uk          1      1
      6     3 aus         0      0
      7     3 uk          1      1
      

      【讨论】:

        【解决方案3】:

        我不确定这是否是您正在寻找的。这是一个没有外部库的解决方案:

        df$sideuk <- apply(df, 1, function(row) {
          return(
            as.integer(any(df[df$ID==row["ID"] & df$country=="uk" & row["side"] == 1, "side"]))
          )
        })
        

        返回:

          ID country side sideuk
        1  1     arg    1      0
        2  1     usa    0      0
        3  2     ita    1      1
        4  2     usa    0      0
        5  2      uk    1      1
        6  3     aus    0      0
        7  3      uk    1      1
        8  4      mx    1      0
        9  4      uk    0      0
        

        样本数据

        df <- read.table(text =
                           "ID  country    side
                         1    arg       1
                         1    usa       0
                         2    ita       1
                         2    usa       0
                         2    uk        1
                         3    aus       0
                         3    uk        1
                         4    mx        1
                         4    uk        0", header = T)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-19
          • 1970-01-01
          • 2016-02-17
          • 2022-06-17
          • 2020-12-05
          • 2017-02-14
          相关资源
          最近更新 更多