【问题标题】:Assign ID to consecutive groups column r将 ID 分配给连续组列 r
【发布时间】:2020-10-16 11:18:13
【问题描述】:

我想在 data.frame 中生成一个列来计算组的连续 id(虚拟 df 中的 s 列)

dummy_df = data.frame(s = c("a", "a", "b","b", "b", "c","c", "a", "a", "c", "c","a","a"),
                  desired_output= c(1,1,1,1,1,1,1,2,2,2,2,3,3))
dummy_df$rleid_output = rleid(dummy_df$s)
dummy_df
   s desired_output rleid_output
1  a              1            1
2  a              1            1
3  b              1            2
4  b              1            2
5  b              1            2
6  c              1            3
7  c              1            3
8  a              2            4
9  a              2            4
10 c              2            5
11 c              2            5
12 a              3            6
13 a              3            6

我会说它类似于 rleid() 所做的,但会在看到新组时重新开始计数。但是,我找不到以如此直接的方式做到这一点的方法。谢谢。

【问题讨论】:

    标签: r dataframe grouping unique cumulative-sum


    【解决方案1】:

    你可以这样做:

    dummy_df$out <- with(rle(dummy_df$s), rep(ave(lengths, values, FUN = seq_along), lengths))
    

    结果:

       s desired_output out
    1  a              1   1
    2  a              1   1
    3  b              1   1
    4  b              1   1
    5  b              1   1
    6  c              1   1
    7  c              1   1
    8  a              2   2
    9  a              2   2
    10 c              2   2
    11 c              2   2
    12 a              3   3
    13 a              3   3
    

    【讨论】:

    • 嘿,我知道 rep 和 ave 是做什么的,但是你能解释一下这段代码是做什么的吗:rep(ave(lengths, values, FUN = seq_along)
    • rle() 返回两个组件的列表 lengthsvalues 所以 ave()seq_along() 返回每​​个组的增量索引。
    【解决方案2】:

    如果你愿意使用data.tablerleid是包的一部分),你可以分两步完成:

    library(data.table)
    dummy_df = data.frame(s = c("a", "a", "b", "b", "b", "c", "c", "a", "a", "c", "c", "a", "a"))
    # cast data.frame to data.table
    setDT(dummy_df)
    # create auxiliary variable
    dummy_df[, rleid_output := rleid(s)]
    # obtain desired output
    dummy_df[, desired_output := rleid(rleid_output), by = "s"]
    # end result
    dummy_df
    #>     s rleid_output desired_output
    #>  1: a            1              1
    #>  2: a            1              1
    #>  3: b            2              1
    #>  4: b            2              1
    #>  5: b            2              1
    #>  6: c            3              1
    #>  7: c            3              1
    #>  8: a            4              2
    #>  9: a            4              2
    #> 10: c            5              2
    #> 11: c            5              2
    #> 12: a            6              3
    #> 13: a            6              3
    

    reprex package (v0.3.0) 于 2020 年 10 月 16 日创建

    【讨论】:

      【解决方案3】:

      您可以尝试将 tidyverse 与基本 R rle 函数结合使用

      library(tidyverse)
      rle(dummy_df$s) %>% 
        with(., data.frame(a=.$length, b=.$value)) %>% 
        group_by(b) %>% 
        mutate(n = 1:n()) %>%
        with(., rep(n, times=a)) %>% 
        bind_cols(dummy_df, res=.)
         s desired_output res
      1  a              1   1
      2  a              1   1
      3  b              1   1
      4  b              1   1
      5  b              1   1
      6  c              1   1
      7  c              1   1
      8  a              2   2
      9  a              2   2
      10 c              2   2
      11 c              2   2
      12 a              3   3
      13 a              3   3
      

      【讨论】:

        猜你喜欢
        • 2020-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多