【问题标题】:How to create a new column with an incrementing sequence number in an R dataframe, such that it gets incremented based on other column values如何在 R 数据框中创建具有递增序列号的新列,以便它根据其他列值递增
【发布时间】: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 &lt;- cumsum(df$IsNewSession)
  • ....假设您的变量是逻辑变量而不是字符变量:-)
  • 如果第一个值为FALSE,则评论中的问题不起作用。
  • @troh 我认为第一个值总是TRUE,因为该列是IsNewSession
  • @www 我明白你的意思。我正在考虑一种更通用的方法。

标签: r dataframe dplyr


【解决方案1】:

如果第一个值为FALSE,则评论中的问题不起作用。

df$SessionNumber <- cumsum(df$IsNewSession) + as.numeric(!df$SessionNumber[1])

【讨论】:

    猜你喜欢
    • 2020-10-03
    • 1970-01-01
    • 2020-04-12
    • 2021-10-03
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    相关资源
    最近更新 更多