【问题标题】:R - Select specific rows within group of rowsR - 选择一组行中的特定行
【发布时间】:2018-04-08 01:50:07
【问题描述】:

我有一个类似以下的数据框:

     ID          STATUS
1638483        Very bad
1407499       Very good
1383920            Good
1407499             Bad

第一列包含ID,有些是唯一的,有些则不是。
第二列包含STATUS,可以是:"Very good""Good""Bad""Very Bad"

我想:

  • 保留具有唯一ID 的行(STATUS 在这里无关紧要):例如具有ID 16384831383920 的行,
  • 只为具有非唯一ID 的行选择具有最佳状态的行:例如具有ID 1407499 的行

期望的输出是:

     ID          STATUS
1638483        Very bad
1407499       Very good
1383920            Good

我尝试使用dplyr 包。 我成功按ID 对数据进行分组,但后来卡住了。

【问题讨论】:

    标签: r dataframe group-by row


    【解决方案1】:

    使用 dplyr 的一种可能解决方案:

    # create tibble
    df <- tibble(
      id = c("1638483", "1407499", "1383920", "1407499"),
      status = c("Very bad", "Very good", "Good", "Bad")
    )
    
    # solution
    df %>%
      mutate_at("status", factor, 
                levels = c("Very bad", "Bad", "Good", "Very good")) %>%
      arrange(desc(status)) %>%
      group_by(id) %>%
      filter(status == status[1]) %>%
      ungroup()
    

    结果:

    # A tibble: 3 x 2
           id    status
        <chr>    <fctr>
    1 1383920      Good
    2 1407499 Very good
    3 1638483  Very bad
    

    【讨论】:

    • 谢谢!如果我有几行“非常好”,我怎样才能保留所有这些,而不是只用 slice(1) 保留其中一个?
    • 您可以将slice(1) 替换为filter(status == status[1])
    • 谢谢!它只会在“非常好”状态下工作,对吧?如果每个组中的最佳状态不同怎么办?假​​设我们有一个组有几个“非常好”,另一个有几个“好”。有可能做类似的事情吗?
    • 它适用于任何状态。如果某个 id 的“最佳状态”不是“非常好”,并且该 id 的多行具有相同的状态,则它们都将保留在数据集中。
    【解决方案2】:

    根据需要将STATUS转换为factorlevels并使用ave

    df$STATUS = factor(df$STATUS, levels = c("Very bad", "Bad", "Good", "Very good"))
    df[ave(as.numeric(df$STATUS), df$ID, FUN = function(x) x == max(x)) == 1,]
    #       ID    STATUS
    #1 1638483  Very bad
    #2 1407499 Very good
    #3 1383920      Good
    

    数据

    df = structure(list(ID = c(1638483L, 1407499L, 1383920L, 1407499L), 
        STATUS = c("Very bad", "Very good", "Good", "Bad")), .Names = c("ID", 
    "STATUS"), class = "data.frame", row.names = c(NA, -4L))
    

    【讨论】:

    • @Henrik,我无法让它工作,但 aggregate(STATUS ~ ID, df, function(x) x[which.max(as.numeric(x))]) 工作
    • 我使用了ordered = TRUE。我想念你没有。对困惑感到抱歉。 IE。 d$STATUS &lt;- factor(d$STATUS, levels = c("Very_bad", "Bad", "Good", "Very_good"), ordered = TRUE); aggregate(STATUS ~ ID, max, data = d)
    猜你喜欢
    • 1970-01-01
    • 2015-05-16
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多