R 聚合连续行

R 聚合连续行,r,R,我在R中有一个data.frame和一系列变量 userID (numeric) var1 (factor) var2 (factor) time (character) action (character) 前3列对于每个用户会话都是相同的,可以有许多行。但是,time和action每行都会更改 我尝试了aggregate将整个会话(连续行)合并到一行中 dat <- aggregate(cbind(time, action) ~ userID + var1 + var2,

我在R中有一个
data.frame
和一系列变量

userID (numeric) var1 (factor) var2 (factor) time (character) action (character)
前3列对于每个用户会话都是相同的,可以有许多行。但是,
time
action
每行都会更改

我尝试了
aggregate
将整个会话(连续行)合并到一行中

dat <- aggregate(cbind(time, action) ~ userID + var1 + var2, 
    data = log, FUN = paste, collapse = "|")

dat我将创建一个user.session ID,以便为给定用户/var1/var2的每个连续行序列分配一个唯一的ID。首先,一个示例数据集

log<-data.frame(
    user = rep(c(1,2,3,1,3,4), times),
    var1 = factor(rep(letters[c(1,2,3,1,3,4)+7], times)),
    var2 = factor(rep(letters[c(1,2,3,1,3,4)+13], times)),
    time = "a",
    action="b",
    stringsAsFactors=F
)

就像MrFlick所说的,除了创建
user.session
变量外,还使用:

rle <- with(log, rle(as.character(interaction(user, var1, var2))))
log$user.session <- rep(seq_along(rle$lengths), rle$lengths)

rle所以在床上我有了相同的认识,那就是添加一个user.session列。我喜欢你们的两种解决方案,但第二种更容易理解,这就是我选择它的原因。无论如何,这是第三种可能性

日志$user.session
dat <- aggregate(cbind(time, action) ~ user + var1 + var2 + user.session, 
    data = log, FUN = paste, collapse = "|")
  user var1 var2 user.session          time        action
1    1    h    n            1     a|a|a|a|a     b|b|b|b|b
2    2    i    o            1         a|a|a         b|b|b
3    3    j    p            1             a             b
4    4    k    q            1         a|a|a         b|b|b
5    1    h    n            2           a|a           b|b
6    3    j    p            2 a|a|a|a|a|a|a b|b|b|b|b|b|b
rle <- with(log, rle(as.character(interaction(user, var1, var2))))
log$user.session <- rep(seq_along(rle$lengths), rle$lengths)