Создать новый столбец в кадре данных из предыдущих строк из факторной переменной - PullRequest
1 голос
/ 28 мая 2019

Имеется такой кадр данных:

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

Мои цели: а) назначить одно и то же значение всем последовательным вхождениям одного и того же значения в столбце «команда» б) подсчитать все перенесенные значения "team" в столбце "poss" (1,2,3 и т. д.) в) если значение в столбце «игра» меняется, перезапустите тот же процесс

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Мы можем создать новый столбец, представляющий row_number() кадра данных, group_by game и team и увеличить счетчик, когда diff разность между последовательными 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
0 голосов
/ 28 мая 2019

Можно сгруппировать по «игре», а затем получить идентификатор длины бега на основе первого уровня «команды» и fill элементов NA с предыдущими элементами, отличными от 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...