如何为每个记录序列分配唯一的ID?

时间:2016-01-14 12:50:31

标签: r

如何为每个记录序列分配唯一ID?

例如,我有下表:

time    machine visitor
11:30   A       123
11:31   A       123
11:33   A       123
11:34   A       256
11:35   A       256
11:36   A       256
11:37   A       256
11:38   A       789
11:40   A       789
11:42   A       789
11:50   A       123
11:51   A       123

因此我希望将以下会话ID添加到每条记录中:

time    machine visitor session
11:30   A       123     1
11:31   A       123     1
11:33   A       123     1
11:34   A       256     2
11:35   A       256     2
11:36   A       256     2
11:37   A       256     2
11:38   A       789     3
11:40   A       789     3
11:42   A       789     3
11:50   A       123     4
11:51   A       123     4

我写了一个应该这样做的循环,但它太慢了:

session = 1
for (i in 2:nrow(df)) {
  if(df[i, ]$visitor != df[i-1, ]$visitor)
  {
    session = session + 1
  }
  df[i, ]$session = session
}

2 个答案:

答案 0 :(得分:1)

我们可以尝试

library(data.table)
setDT(df1)[, session:= .GRP, .(visitor, machine)]

或者没有任何分组,使用base R

v1 <- do.call(paste, df1[c('visitor', 'machine')])
df1$session <- match(v1, unique(v1))

如果访客&#39;经过一些休息后重复,我们可以在会议期间进行会议。与众不同

setDT(df1)[, session := rleid(visitor)]
df1
#    time machine visitor session
#1: 11:30       A     123       1
#2: 11:31       A     123       1
#3: 11:33       A     123       1
#4: 11:34       A     256       2
#5: 11:35       A     256       2
#6: 11:36       A     256       2
#7: 11:37       A     256       2
#8: 11:38       A     789       3
#9: 11:40       A     789       3
#10:11:42       A     789       3

答案 1 :(得分:0)

可能不是最清晰的方法,但您可以执行以下操作:

void readAddress(uint16_t **pointer_)
{
    *pointer_ = readArray();
}

稍微分解一下:

df$session <- cumsum(c(TRUE,as.logical(diff(df$visitor))))