【问题标题】:Rolling index for semi-unique values in two columns R两列R中半唯一值的滚动索引
【发布时间】:2021-05-21 07:44:21
【问题描述】:

我希望添加一个滚动 ID 列。这是数据框的示例。

df <- data.frame("participant" = c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c"), 
                 "item" = c("X", "X", "Y", "X", "X", "X", "Y", "Z", "Z", "Z"))

这是我正在尝试做的事情(item_ID 列),但有两件棘手的事情:

  1. 项目不是唯一的,因此解决方案需要逐行为每个新值分配一个新数字(例如,参与者“a”有两个“X”项目,item_ID = 1 和 3)。

  2. 一个参与者的最后一个项目可能与下一个参与者的第一个项目相同(例如,参见参与者“a”和“b”中的项目“X”);这些需要获得唯一的 ID。有任何想法吗?非常感谢任何和所有的帮助!

       participant item  item_ID
    1            a    X        1
    2            a    X        1
    3            a    Y        2
    4            a    X        3
    5            b    X        4
    6            b    X        4
    7            b    Y        5
    8            b    Z        6
    9            c    Z        7
    10           c    Z        7
    

【问题讨论】:

    标签: r indexing


    【解决方案1】:

    Method-1 baseR方式

    df <- data.frame("participant" = c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c"), 
                     "item" = c("X", "X", "Y", "X", "X", "X", "Y", "Z", "Z", "Z"))
    
    transform(df, item_id = with(rle(paste(participant, item)), rep(seq_len(length(lengths)), lengths)))
    #>    participant item item_id
    #> 1            a    X       1
    #> 2            a    X       1
    #> 3            a    Y       2
    #> 4            a    X       3
    #> 5            b    X       4
    #> 6            b    X       4
    #> 7            b    Y       5
    #> 8            b    Z       6
    #> 9            c    Z       7
    #> 10           c    Z       7
    

    reprex package (v2.0.0) 于 2021 年 5 月 21 日创建


    方法二data.table::rleid()

    df <- data.frame("participant" = c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c"), 
                     "item" = c("X", "X", "Y", "X", "X", "X", "Y", "Z", "Z", "Z"))
    library(data.table)
    library(tidyverse)
    df %>% mutate(item_id = rleid(participant, item))
    #>    participant item item_id
    #> 1            a    X       1
    #> 2            a    X       1
    #> 3            a    Y       2
    #> 4            a    X       3
    #> 5            b    X       4
    #> 6            b    X       4
    #> 7            b    Y       5
    #> 8            b    Z       6
    #> 9            c    Z       7
    #> 10           c    Z       7
    

    reprex package (v2.0.0) 于 2021 年 5 月 21 日创建

    【讨论】:

      【解决方案2】:
      tmp=rle(paste(df$participant,df$item))
      df$item_id=rep(1:length(tmp$lengths),tmp$lengths)
      
         participant item item_id
      1            a    X       1
      2            a    X       1
      3            a    Y       2
      4            a    X       3
      5            b    X       4
      6            b    X       4
      7            b    Y       5
      8            b    Z       6
      9            c    Z       7
      10           c    Z       7
      

      【讨论】:

        猜你喜欢
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 2016-04-14
        • 2014-07-16
        相关资源
        最近更新 更多