这就是我简化的数据框架 -
App IsNewSession
Word TRUE
Excel FALSE
Chrome TRUE
Notepad FALSE
Chrome FALSE
Notepad FALSE
Excel TRUE
Chrome FALSE
我需要创建一个名为SessionNumber的新列。每次IsNewSession = TRUE,会话编号应该是前一行的会话编号+ 1.否则,它只保留与前一行相同的会话编号。
所需数据框 -
App IsNewSession SessionNumber
Word TRUE 1
Excel FALSE 1
Chrome TRUE 2
Notepad FALSE 2
Chrome FALSE 2
Notepad FALSE 2
Excel TRUE 3
Chrome FALSE 3
我可以使用for循环执行此操作,但我的数据帧非常大(250K行)并且需要很长时间。
我尝试使用像这样的mutate,但这也不起作用。 df $ SessionNumber = 1
library(dplyr)
df <- df %>%
mutate(SessionNumber = ifelse(IsNewSession, lag(SessionNumber) + 1, lag(SessionNumber)))
在R中执行此操作的高效方法是什么?
谢谢!
答案 0 :(得分:1)
如果第一个值为FALSE
,则评论中的问题不起作用。
df$SessionNumber <- cumsum(df$IsNewSession) + as.numeric(!df$SessionNumber[1])