Создать идентификатор столбца - PullRequest
2 голосов
/ 14 января 2020

Я работаю с данными журнала; пытаясь найти круглый номер каждого события. Начало раунда сигнализируется действием == «начало». Я хочу создать столбцы «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", в столбец, чтобы Я знаю, какому круглому числу соответствует каждый столбец (см. Желаемый результат выше).

1 Ответ

3 голосов
/ 14 января 2020

Вы можете использовать cumsum после группировки по Id.

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

#   Id    action action.round
#  <chr>  <chr>         <int>
# 1 A     start            1
# 2 A     na               1
# 3 A     start            2
# 4 A     na               2
# 5 A     na               2
# 6 A     na               2
# 7 A     na               2
# 8 A     start            3
# 9 B     start            1
#10 B     na               1
#11 B     start            2
#12 B     na               2
#13 B     start            3
#14 B     na               3

Это можно сделать и в базе 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]

данные

data <- structure(list(Id = c("A", "A", "A", "A", "A", "A", "A", "A", 
"B", "B", "B", "B", "B", "B"), action = c("start", "na", "start", 
"na", "na", "na", "na", "start", "start", "na", "start", "na", 
"start", "na")), row.names = c(NA, -14L), spec = structure(list(
cols = list(Id = structure(list(), class = c("collector_character", 
"collector")), action = structure(list(), class = c("collector_character", 
"collector")), action.round = structure(list(), class = c("collector_double", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1), class = "col_spec"), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"))
...