Учитывая такой фрейм данных:
game team
zap.che zap
zap.che che
zap.che zap
zap.che zap
zap.che che
bar.var bar
bar.var var
bar.var var
bar.var bar
bar.var bar
Я хотел бы добавить еще один новый столбец, который был бы моим желаемым результатом примерно так:
game team poss
zap.che zap 1
zap.che che 1
zap.che zap 2
zap.che zap 2
zap.che che 2
bar.var bar 1
bar.var var 1
bar.var var 1
bar.var bar 2
bar.var bar 2
Мои цели: а) присвоить одно и то же значение всем последовательным вхождениям одного и того же значения в столбце «команда» б) подсчитайте все обернутые значения «команды» в столбце «возможно» (1,2,3 и т. д.) в) как только в столбце «игра» значение изменится, перезапустить тот же процесс
Логика следующая: например, каждый раз, когда появляется значение в столбце «команда» (например, «zap»), мы считаем его новым вхождением «poss» (1,2,3,..), за исключением случаев, когда «zap " появляется последовательно (в этом случае мы считаем, что это вхождение принадлежит одному и тому же значению "poss"). Как только значение «game» изменяется, счетчик «poss» перезапускается в соответствии с теми же критериями.
Но в bar.var
нет "зап"
Как я уже говорил, как только значение «game» изменяется, счетчик «poss» перезапускается по тем же критериям, теперь с «bar» или «var».
@teogi Пожалуйста, проверьте мой обновленный ответ
Можно было бы сгруппировать по «игре», а затем получить идентификатор длины прогона на основе первого уровня «команды» и fill
элементов NA
с предыдущими элементами, не относящимися к Северной Америке.
library(dplyr)
library(tidyr)
library(data.table)
df1 %>%
group_by(game = factor(game, levels = unique(game))) %>%
mutate(poss = as.integer(factor(rleid(team != first(team)) *
NA^(team != first(team))))) %>%
fill(poss)
# A tibble: 10 x 3
# Groups: game [2]
# game team poss
# <fct> <chr> <int>
# 1 zap.che zap 1
# 2 zap.che che 1
# 3 zap.che zap 2
# 4 zap.che zap 2
# 5 zap.che che 2
# 6 bar.var bar 1
# 7 bar.var var 1
# 8 bar.var var 1
# 9 bar.var bar 2
#10 bar.var bar 2
df1 <- structure(list(game = c("zap.che", "zap.che", "zap.che", "zap.che",
"zap.che", "bar.var", "bar.var", "bar.var", "bar.var", "bar.var"
), team = c("zap", "che", "zap", "zap", "che", "bar", "var",
"var", "bar", "bar")), class = "data.frame", row.names = c(NA,
-10L))
Мы можем создать новый столбец, представляющий row_number()
кадра данных, group_by
game
и team
, и увеличивать счетчик, когда diff
erence между последовательными row
больше 1.
library(dplyr)
df %>%
mutate(row = row_number()) %>%
group_by(game, team) %>%
mutate(poss = cumsum(c(TRUE, diff(row) > 1)))%>%
select(-row)
# game team poss
# <fct> <fct> <int>
# 1 zap.che zap 1
# 2 zap.che che 1
# 3 zap.che zap 2
# 4 zap.che zap 2
# 5 zap.che che 2
# 6 bar.var bar 1
# 7 bar.var var 1
# 8 bar.var var 1
# 9 bar.var bar 2
#10 bar.var bar 2
Большое спасибо, Ронак!
Не понятно по логике. Почему число меняется только для определенных значений