生成列ID

问题描述 投票:0回答:1

我正在处理日志数据;试图找到每个事件的轮数。回合的开始由action ==“ start”表示。我想创建一个“ action.round”列,告诉我每个事件对应的回合。

我有这样的数据:

    data <- read_table2("Id action 
A   start
A   na
A   start
A   na
A   na
A   na
A   na
A   start
B   start
B   na
B   start
B   na
B   start
B   na" 

我正在尝试创建这样的输出:

output <- read_table2("Id   action  action.round
A   start   1
A   na  1
A   start   2
A   na  2
A   na  2
A   na  2
A   na  2
A   start   3
B   start   1
B   na  1
B   start   2
B   na  2
B   start   3
B   na  3")

到目前为止,我已经可以通过使用row_number()来获得部分输出,如下所示:

` data %>% 
  mutate(round.start=case_when(actionValue=="start"~"start",TRUE~"NA")) %>%
  ungroup() %>%
  group_by(Id,round.start) %>%
  mutate(action.round=row_number())`

但是现在,我想将与round.start ==“ start”对应的轮数填充到该列中,以便我知道每列实际上对应于哪个轮数(请参见上面的期望输出)。

r dplyr mutate row-number
1个回答
1
投票

cumsum分组后可以使用Id

library(dplyr)
data %>% group_by(Id) %>% mutate(acion.round = cumsum(action == "start"))

这可以在基数R中完成

data$action.round <- with(data, ave(action == "start", Id, FUN = cumsum))

以及data.table也是>

library(data.table)
setDT(data)[, action.round := cumsum(action == "start"), Id]
© www.soinside.com 2019 - 2024. All rights reserved.