【发布时间】:2017-12-14 18:35:03
【问题描述】:
这就是我的简化数据框的样子 -
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 中执行此操作的高性能方法是什么?
谢谢!
【问题讨论】:
-
df$SessionNumber <- cumsum(df$IsNewSession) -
....假设您的变量是逻辑变量而不是字符变量:-)
-
如果第一个值为
FALSE,则评论中的问题不起作用。 -
@troh 我认为第一个值总是
TRUE,因为该列是IsNewSession。 -
@www 我明白你的意思。我正在考虑一种更通用的方法。