我正在处理日志数据;试图找到每个事件的轮数。回合的开始由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”对应的轮数填充到该列中,以便我知道每列实际上对应于哪个轮数(请参见上面的期望输出)。
按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]