【问题标题】:Row selection by group and column conditions按组和列条件选择行
【发布时间】:2021-07-06 07:34:06
【问题描述】:

我正在尝试将左侧的数据框转换为右侧的数据框(如下图所示),

在其他列上使用条件:

  1. Block1(顶部蓝色块):如果 Col4 在组内具有最低但不重复的值,则必须选择该行(下图示例中的第 5 行)
  2. Block2(从上数第二个浅绿色块):如果 Col4 具有相同的重复值,则 Col5 的最小值起作用。但是,第 9 行和第 10 行有联系。要打破平局:按排名,必须选择较高的行或最后一行(第 10 行而不是第 9 行,因为 10 大于 9)。
  3. 在从顶部算起的第三个块(红色)中,Col4 有两个 1(Col4 中的最低值),对应的 Col5 有两个 2。由于第 11 行和第 13 行现在有关系,因此必须按等级选择较高的行或最后一行(第 13 行而不是 11 行,因为 13 大于 11)。

上述逻辑对其他块继续。

使用切片的 tidyverse dplyr 方法,

DF <- Data_Frame %>% dplyr::group_by(Col1, Col2, Col3) %>% dplyr::slice(which.min(Col4))

产生以下结果:

我在上面的代码中做错了什么?

上面使用的数据框是:

Data_Frame <- data.frame(Col1 = c("A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A2", "A2", "A2", "A2", "A2", "A2", "A3", "A3", "A3", "A3", "A3", "A3", "A3"), 
                         
                         Col2 = c("a", "a", "a", "a", "b", "b", "b", "b", "b", "c", "c", "c", "c", "d", "d", "d", "e", "e", "e", "f", "f", "f", "g", "g", "g", "h", "h", "h", "h"),
                         
                         Col3 = c("Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Bb1","Bb1", "Bb1", "Bb1", "Bb1", "Bb1", "Cc1", "Cc1", "Cc1", "Cc1", "Cc1", "Cc1", "Cc1"),
                         
                         Col4 = c(4, 2, 2, 1, 4, 4, 4, 4, 4, 1, 3, 1, 2, 3, 3, 3, 1, 3, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1),
                         
                         Col5 = c(7, 6, 3, 1, 3, 2, 5, 1, 1, 2, 3, 2, 4, 1, 3, 1, 2, 4, 3, 1, 2, 1, 1, 2, 1, 4, 4, 2, 2))

【问题讨论】:

    标签: r dataframe dplyr conditional-statements aggregate


    【解决方案1】:

    Ray,我相信您希望用最小值总结您的数据框,但是在我看来,您的第三点非常令人困惑,但我运行了以下代码,结果对我来说很好,

    df %>% group_by(Col1,Col2,Col3) %>% summarise(Col4 = min(Col4),Col5 = min(Col5))
    

    【讨论】:

    • 亲爱的,你试过我的代码了吗?您遇到任何错误吗?谢谢
    • 代码工作正常,但我只是想知道是否根据行索引选择了正确的行。
    • 您发布的数据框现在有点帮助,让我重新评估一下,如果我发现有说服力的东西,我会分享给您
    • 是的,我确实尝试过您的代码。谢谢你。我的观点是,在第 2 块中,必须从第 9 行和第 10 行中选择 10 行。在块 3 中,必须从第 11 行和第 13 行中选择第 13 行。它是否选择 9 和 11 而不是 10 和 13(预期)?行索引可能在排名和选择中起作用吗?
    【解决方案2】:

    第一组。然后用row_number()uniteCol4Col5创建排名,然后过滤

    library(tidyverse)
    df %>% 
      group_by(Col1, Col2) %>% 
      mutate(r_nr = row_number()) %>% 
      unite(Col45, c(Col4, Col5), sep="", remove=FALSE) %>% 
      filter(Col45 == min(Col45)) %>% 
      slice_max(r_nr) %>% 
      select(-Col45, -r_nr)
    

    输出:

      Col1  Col2  Col3   Col4  Col5
      <chr> <chr> <chr> <dbl> <dbl>
    1 A1    a     Aa1       1     1
    2 A1    b     Aa1       4     1
    3 A1    c     Aa1       1     2
    4 A1    d     Aa1       3     1
    5 A2    e     Bb1       1     2
    6 A2    f     Bb1       2     1
    7 A3    g     Cc1       1     1
    8 A3    h     Cc1       1     2
    

    数据:

    df <- structure(list(Col1 = c("A1", "A1", "A1", "A1", "A1", "A1", "A1", 
    "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A2", "A2", 
    "A2", "A2", "A2", "A2", "A3", "A3", "A3", "A3", "A3", "A3", "A3"
    ), Col2 = c("a", "a", "a", "a", "b", "b", "b", "b", "b", "c", 
    "c", "c", "c", "d", "d", "d", "e", "e", "e", "f", "f", "f", "g", 
    "g", "g", "h", "h", "h", "h"), Col3 = c("Aa1", "Aa1", "Aa1", 
    "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", 
    "Aa1", "Aa1", "Aa1", "Aa1", "Bb1", "Bb1", "Bb1", "Bb1", "Bb1", 
    "Bb1", "Cc1", "Cc1", "Cc1", "Cc1", "Cc1", "Cc1", "Cc1"), Col4 = c(4, 
    2, 2, 1, 4, 4, 4, 4, 4, 1, 3, 1, 2, 3, 3, 3, 1, 3, 2, 2, 2, 2, 
    1, 1, 1, 2, 2, 1, 1), Col5 = c(7, 6, 3, 1, 3, 2, 5, 1, 1, 2, 
    3, 2, 4, 1, 3, 1, 2, 4, 3, 1, 2, 1, 1, 2, 1, 4, 4, 2, 2)), class = "data.frame", row.names = c(NA, 
    -29L))
    

    【讨论】:

    • 这正是工作。非常感谢。
    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多