两列R中的半唯一值的滚动索引



我想添加一个滚动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"one_answers"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
    

方法-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

创建于2021-05-21由reprex包(v2.0.0(


方法-2data.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

创建于2021-05-21由reprex包(v2.0.0(

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

最新更新