【问题标题】:Rows selection based on the groups and ID match within group基于组和组内 ID 匹配的行选择
【发布时间】:2021-01-11 20:53:52
【问题描述】:

我正在尝试根据另一组的值选择行。这是虚拟数据框

das <- data.frame(weigh=c(10,30,15,11,14,50,30,32,34,60,17,31,2,6,66,5,4,20,21,12,8,56,6,19),
                  id =c(123,124,125,126,127,128,1223,1224,1226,1225,1227,1228,123,124,125,126,127,128,1223,1224,1225,1226,1227,1228),
                  label=c("A","A","A","A","A","A","B","B","B","B","B","B"),
                  category=c(1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3))

我按类别和标签进行分组,然后选择权重最大的行。我喜欢这个。

das %>% group_by(category,label) %>% slice(which.max(weigh))

但我想做的是从另一个类别中的同一标签中捕获具有 id 值的行。所以这个虚拟示例中的预期输出是这样的

weigh   id label category
50  128     A        1
15  125     A        1
60 1225     B        1
34 1226     B        1
66  125     A        3
20  128     A        3
56 1226     B        3
8 1225     B        3

【问题讨论】:

    标签: r dplyr group-by tidyverse


    【解决方案1】:

    一种方法是通过id 将数据连接回原始数据:

    library(dplyr)
    
    das %>% 
      group_by(category,label) %>% 
      slice(which.max(weigh)) %>%
      left_join(das, by = 'id') %>%
      select(weigh = weigh.y, id, category = category.y, label = label.y) %>%
      arrange(category, label)
    
    #  weigh    id category label
    #  <dbl> <dbl>    <dbl> <chr>
    #1    50   128        1 A    
    #2    15   125        1 A    
    #3    60  1225        1 B    
    #4    34  1226        1 B    
    #5    20   128        3 A    
    #6    66   125        3 A    
    #7     8  1225        3 B    
    #8    56  1226        3 B   
    

    【讨论】:

      【解决方案2】:

      我们可以在不加入的情况下做到这一点

      library(dplyr)
      das %>%
         group_by(category, label) %>% 
         mutate(flag = weigh == max(weigh)) %>%
         group_by(id) %>%
         filter(any(flag)) %>%
         select(-flag)
      # A tibble: 8 x 4
      # Groups:   id [4]
      #  weigh    id label category
      #  <dbl> <dbl> <chr>    <dbl>
      #1    15   125 A            1
      #2    50   128 A            1
      #3    34  1226 B            1
      #4    60  1225 B            1
      #5    66   125 A            3
      #6    20   128 A            3
      #7     8  1225 B            3
      #8    56  1226 B            3
      

      【讨论】:

        猜你喜欢
        • 2013-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-15
        • 1970-01-01
        • 2016-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多