Как заменить отсутствующие значения на 0 для случаев, удовлетворяющих заданным c условиям в R? - PullRequest
3 голосов
/ 28 марта 2020

Справочная информация:

Я работаю с большим набором данных, который содержит продольные данные об игровом поведении 195 318 участников. Данные основаны на полном отслеживании поведения азартных игр электронов c в операторе азартных игр. Данные об игровом поведении агрегируются на ежемесячном уровне, всего 70 месяцев. У меня есть разделительная переменная ID участников, временная переменная (месяцы), а также многочисленные переменные игрового поведения, такие как активные дни, сыгранные в течение данного месяца, ставки, сделанные на данный месяц, общие потери за данный месяц и т. Д. c. Участники различаются в том, когда они были активными азартными играми. Один участник мог сыграть на 2, 3, 4 и 7 месяце, другой участник на 3, 5 и 7, а третий на 23, 24, 48, 65 и c. Таким образом, существует значительное количество «пропущенных значений». Однако, поскольку отслеживаются все случаи азартных игр, отсутствие в этом наборе данных означает, что человек не играл в азартные игры. Другими словами, пропущенное равно 0.

Проблема / цель:

Я хочу вменять 0 для пропущенных значений («NA»). Однако Я хочу сделать это только при определенных c обстоятельствах. В частности, я хочу вменить 0 для пропущенных значений в рамках того, что я определяю как «активный период» участника, и оставить все остальное как есть.

Активный период участника - каждый месяц между его первым активным месяцем азартных игр и их последним месяцем. азартные игры. Например, для участника, игравшего в азартные игры в 2, 3, 4 и 7 месяце, я хочу вменять 0 в 5 и 6 месяцы. Каждый второй месяц, то есть от 1 до 9 до 70, я хочу остаться как NA. Я изо всех сил пытаюсь написать код, который достигает этого. Я новичок в R.

Пример кадра данных и кода

Ниже приведен пример кода, который создает кадр данных, который иллюстрирует ключевые характеристики, описанные в моей задаче. В этом коде всего 2 участника, 1 переменная игрового поведения и 10 временных точек («волны»). Я включил фрейм данных в «длинный формат» и «широкий формат», потому что я не уверен, какой из них будет наиболее полезным / информативным. Переменная времени включена в «длинный формат». Мой фактический набор данных представлен в длинном формате, но я знаком с тем, как переключаться между ними.

# Example variables and data frame in long form
  # Includes id variable, time variable and example variable
id <- c(1, 1, 1, 1, 2, 2, 2)
time <- c(2, 3, 4, 7, 3, 5, 7)
daysPlayed <- c(2, 2, 3, 3, 2, 2, 2)
dfLong <- data.frame(id = id, time = time, daysPlayed = daysPlayed)

Создано в 2020-03-28 с помощью пакета prex (v0.3.0)

# Example variables and data frame in wide form
  # Includes id variable, days played in given month 
id <- c(1, 2)
daysPlayed.1 <- c(NA, NA)
daysPlayed.2 <- c(2, NA)
daysPlayed.3 <- c(2, 2)
daysPlayed.4 <- c(3, NA)
daysPlayed.5 <- c(NA, 2)
daysPlayed.6 <- c(NA, NA)
daysPlayed.7 <- c(3, 2)
daysPlayed.8 <- c(NA, NA)
daysPlayed.9 <- c(NA, NA)
daysPlayed.10 <- c(NA, NA)
dfWide <- data.frame(id=id, daysPlayed.1 = daysPlayed.1, daysPlayed.2 = daysPlayed.2,
                 daysPlayed.3 = daysPlayed.3, daysPlayed.4 = daysPlayed.4,
                 daysPlayed.5 = daysPlayed.5, daysPlayed.6 = daysPlayed.6,
                 daysPlayed.7 = daysPlayed.7, daysPlayed.8 = daysPlayed.8,
                 daysPlayed.9 = daysPlayed.9, daysPlayed.10 = daysPlayed.10)

Создано в 2020-03-28 пакетом Представить (v0.3.0)

1 Ответ

2 голосов
/ 28 марта 2020

Для этого примера давайте предположим, что каждый игрок ie. id будет иметь данные за 9 месяцев (вы можете перейти к фактическому значению месяца позже), мы можем использовать complete, чтобы заполнить недостающую последовательность месяцев и заполнить значение 0, который находится между ними.

library(dplyr)

dfLong %>%
  tidyr::complete(id, time = 1:9) %>%
  group_by(id) %>%
  mutate(daysPlayed = replace(daysPlayed, is.na(daysPlayed) & 
                      between(row_number(), min(which(!is.na(daysPlayed))),
                      max(which(!is.na(daysPlayed)))), 0))


#     id  time daysPlayed
#   <dbl> <dbl>      <dbl>
# 1     1     1         NA
# 2     1     2          2
# 3     1     3          2
# 4     1     4          3
# 5     1     5          0
# 6     1     6          0
# 7     1     7          3
# 8     1     8         NA
# 9     1     9         NA
#10     2     1         NA
#11     2     2         NA
#12     2     3          2
#13     2     4          0
#14     2     5          2
#15     2     6          0
#16     2     7          2
#17     2     8         NA
#18     2     9         NA

В случае, если мы хотим заполнить пропущенные time для каждого id активного периода, мы можем использовать:

dfLong %>%
  group_by(id) %>%
  tidyr::complete(time = seq(min(time), max(time)), fill = list(daysPlayed = 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...