【问题标题】:Get last row of each group in R [duplicate]获取R中每个组的最后一行[重复]
【发布时间】:2019-05-06 08:10:33
【问题描述】:

我有一些结构类似的数据:

a <- data.frame("ID" = c("A", "A", "B", "B", "C", "C"),
                "NUM" = c(1, 2, 4, 3, 6, 9),
                "VAL" = c(1, 0, 1, 0, 1, 0))

我正在尝试按IDNUM 对其进行排序,然后得到最后一行。 此代码用于获取最后一行并汇总为一个唯一 ID,但是,它实际上并没有像我想要的那样获得完整的最后一行。

a <- a %>% arrange(ID, NUM) %>%
  group_by(ID) %>%
  summarise(max(NUM))

我了解为什么此代码不起作用,但我正在寻找 dplyr 获取每个唯一 ID 的最后一行的方法

预期结果:

  ID        NUM     VAL
  <fct    <dbl>    <dbl>
1 A           2       0
2 B           4       1
3 C           9       0

注意:我承认虽然它几乎与 Select first and last row from grouped data 重复,但该线程上的答案并不是我想要的。

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    你可以试试:

    a %>% 
      group_by(ID) %>% 
      arrange(NUM) %>%  
      slice(n())
    

    【讨论】:

      【解决方案2】:

      一个dplyr 选项可以是:

      a %>%
       arrange(ID, NUM) %>% 
       group_by(ID) %>% 
       summarise_all(last)
      
        ID      NUM   VAL
        <fct> <dbl> <dbl>
      1 A        2.    0.
      2 B        4.    1.
      3 C        9.    0.
      

      或者因为dplyr 1.0.0:

      a %>%
       arrange(ID, NUM) %>% 
       group_by(ID) %>% 
       summarise(across(everything(), last))
      

      或者使用slice_max():

      a %>%
          group_by(ID) %>%
          slice_max(order_by = NUM, n = 1)
      

      【讨论】:

        【解决方案3】:

        tail() 返回子集对象的最后 6 项。当使用aggregate() 时,FUN 参数的参数使用逗号在函数之后立即传递;这里1 指的是n = 1,它告诉tail() 只返回最后一项。

        aggregate(a[, c('NUM', 'VAL')], list(a$ID), tail, 1)
        
        # Group.1 NUM VAL
        # 1       A   2   0
        # 2       B   3   0
        # 3       C   9   0
        

        【讨论】:

        • 将它包含在一些解释中会有所帮助,以及它为什么解决了 OPs 问题。
        【解决方案4】:

        您可以使用top_n。 (分组已经按ID排序,没有必要按NUM排序,因为只有1个值)

        library(dplyr)
        
        a %>% 
          group_by(ID) %>% 
          top_n(1, NUM)
        
        # # A tibble: 3 x 3
        # # Groups:   ID [3]
        #   ID      NUM   VAL
        #   <fct> <dbl> <dbl>
        # 1 A         2     0
        # 2 B         4     1
        # 3 C         9     0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-27
          • 2021-11-05
          • 2014-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-04
          相关资源
          最近更新 更多