代码之家  ›  专栏  ›  技术社区  ›  Cloft X

如何将值分配给R中组的最后一行?

  •  0
  • Cloft X  · 技术社区  · 2 年前

    类似 this question ,我想选择每组的最后一行,并为其分配一个值。

     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))
     
     ID NUM VAL
      A   1   1
      A   2   0
      B   4   1
      B   3   0
      C   6   1
      C   9   0
    

    我想要的输出:

     ID NUM VAL end.spell
      A   1   1         0
      A   2   0         1
      B   4   1         0
      B   3   0         1
      C   6   1         0
      C   9   0         1
    

    我该怎么做?任何帮助都将不胜感激。

    1 回复  |  直到 2 年前
        1
  •  1
  •   DaveArmstrong    2 年前

    使用 group_by() 从…起 dplyr ,您可以识别行号与该组的行数相同的情况,并为该观察值给定1,否则为零。

    library(dplyr)
    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))
    
    
    a %>% 
      group_by(ID) %>% 
      mutate(end.spell = ifelse(row_number() == n(), 1,0))
    #> # A tibble: 6 × 4
    #> # Groups:   ID [3]
    #>   ID      NUM   VAL end.spell
    #>   <chr> <dbl> <dbl>     <dbl>
    #> 1 A         1     1         0
    #> 2 A         2     0         1
    #> 3 B         4     1         0
    #> 4 B         3     0         1
    #> 5 C         6     1         0
    #> 6 C         9     0         1
    

    创建于2024-01-22 reprex v2.0.2

        2
  •  0
  •   jay.sf    2 年前

    确定组 length 并存储在 len 创造 integer 长度为null的向量 伦恩 replace 对应的元素编号 伦恩 具有 1L 。完成时间 ave 在…上 身份证件 s由 身份证件 s*。

    > transform(a, end=ave(ID, ID, FUN=\(x) {
    +   len <- length(x)
    +   replace(integer(len), len, 1L)
    + }))
      ID NUM VAL end
    1  A   1   1   0
    2  A   2   0   1
    3  B   4   1   0
    4  B   3   0   1
    5  C   6   1   0
    6  C   9   0   1
    

    数据:

    > dput(a)
    structure(list(ID = c("A", "A", "B", "B", "C", "C"), NUM = c(1, 
    2, 4, 3, 6, 9), VAL = c(1, 0, 1, 0, 1, 0)), class = "data.frame", row.names = c(NA, 
    -6L))
    
        3
  •  0
  •   TarJae    2 年前

    这是另一个选项,使用 last() :

    library(dplyr)
    a %>% 
      mutate(end.spell = ifelse(VAL == last(VAL), 1, 0))
    
      ID NUM VAL end.spell
    1  A   1   1         0
    2  A   2   0         1
    3  B   4   1         0
    4  B   3   0         1
    5  C   6   1         0
    6  C   9   0         1