【问题标题】:How to find the indexes of the last row by ID?如何通过ID找到最后一行的索引?
【发布时间】:2021-06-13 16:41:48
【问题描述】:

如果我的数据框 df 是这样的:

ID X Y
1 4 6
1 6 5
1 8 4
1 9 6
2 6 4
2 7 5
2 3 9

我想按 ID 对最后一行执行操作,但为此我需要找到这些行的索引。在这个例子中,我想找到索引 4 和 7,它们分别是 ID 1 和 2 中最后一行的索引,然后创建一个新列,我将这些索引中的 X 和 Y 变量相加。所需的输出如下:

ID X Y new
1 4 6 NA
1 6 5 NA
1 8 4 NA
1 9 6 15
2 6 4 NA
2 7 5 NA
2 3 9 12

【问题讨论】:

    标签: r indexing


    【解决方案1】:

    使用以下is_last 的任何定义。这仅使用基础 R,但也可以通过将 transform 替换为 mutate 来与 dplyr 一起使用。

    他们都应该使用问题中显示的数据,但如果数据不同,就会有差异,使用哪一个取决于你想要什么。 findInterval 假定 ID 是按升序排列的。如果 ID 没有连续出现,则 duplicatedave 解决方案标记在每个 ID 的最后一个连续组中找到的最后一个,而 rle 解决方案标记每个连续组中的最后一个。

    is_last <- function(x) !duplicated(x, fromLast = TRUE)
    is_last <- function(x) findInterval(x, x) == seq_along(x)
    is_lsat <- function(x) seq_along(x) %in% cumsum(rle(x)$lengths)
    is_last <- function(x) !!ave(x, x, FUN = function(z) seq_along(z) == length(z))
    
    transform(df1, new = ifelse(is_last(ID), X+Y, NA))
    

    【讨论】:

    • 感谢您的回答!但是,如果我只想要一个带有最后一行 ID 索引的向量呢?在这种情况下,索引为 4 和 7 的向量?
    • 试试which(is_last(df1$ID))na.omit(tt$new),其中is_last在答案中给出,tttransform(...)在答案中的结果。
    【解决方案2】:

    dplyr 方法可能如下所示:

    d <- data.frame(
              ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L),
               X = c(4L, 6L, 8L, 9L, 6L, 7L, 3L),
               Y = c(6L, 5L, 4L, 6L, 4L, 5L, 9L)
    )
    
    library(dplyr)
    
    d %>% 
      group_by(ID) %>% 
      mutate(new = ifelse(row_number() == last(row_number()), X + Y, NA)) %>% 
      ungroup()
    #> # A tibble: 7 x 4
    #>      ID     X     Y   new
    #>   <int> <int> <int> <int>
    #> 1     1     4     6    NA
    #> 2     1     6     5    NA
    #> 3     1     8     4    NA
    #> 4     1     9     6    15
    #> 5     2     6     4    NA
    #> 6     2     7     5    NA
    #> 7     2     3     9    12
    

    【讨论】:

      【解决方案3】:

      data.table:

      library(data.table)
      
      setDT(d)[,new:=fifelse(1:.N==.N,X+Y,NA_real_),by=ID][]
      
         ID X Y new
      1:  1 4 6  NA
      2:  1 6 5  NA
      3:  1 8 4  NA
      4:  1 9 6  15
      5:  2 6 4  NA
      6:  2 7 5  NA
      7:  2 3 9  12
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 2011-05-05
        • 1970-01-01
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        相关资源
        最近更新 更多