Создайте новый столбец в фрейме данных из предыдущих строк из факторной переменной

Учитывая такой фрейм данных:

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 и т. д.) в) как только в столбце «игра» значение изменится, перезапустить тот же процесс

Не понятно по логике. Почему число меняется только для определенных значений

akrun 28.05.2019 16:50

Логика следующая: например, каждый раз, когда появляется значение в столбце «команда» (например, «zap»), мы считаем его новым вхождением «poss» (1,2,3,..), за исключением случаев, когда «zap " появляется последовательно (в этом случае мы считаем, что это вхождение принадлежит одному и тому же значению "poss"). Как только значение «game» изменяется, счетчик «poss» перезапускается в соответствии с теми же критериями.

teogj 28.05.2019 17:00

Но в bar.var нет "зап"

akrun 28.05.2019 17:02

Как я уже говорил, как только значение «game» изменяется, счетчик «poss» перезапускается по тем же критериям, теперь с «bar» или «var».

teogj 28.05.2019 17:52

@teogi Пожалуйста, проверьте мой обновленный ответ

akrun 28.05.2019 17:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Можно было бы сгруппировать по «игре», а затем получить идентификатор длины прогона на основе первого уровня «команды» и 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_bygame и team, и увеличивать счетчик, когда difference между последовательными 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

Большое спасибо, Ронак!

teogj 28.05.2019 17:09

Другие вопросы по теме