背景:
我正在使用一个大型数据集,其中包含195,318名参与者的赌博行为的纵向数据。该数据基于对赌博运营商内部的电子赌博行为的完整跟踪。赌博行为数据每月汇总一次,共70个月。我有一个ID变量,用于分隔参与者,一个时间变量(月),以及许多赌博行为变量,例如给定月份的 Activity 天数,给定月份的下注,给定月份的总损失等。参与者的时间有所不同一直在积极赌博。一个参与者可能在第2、3、4和7个月赌博,另一参与者在3、5和7赌博,而第三个参与者在23、24、48、65等赌博。因此,存在很多“缺失值” ”。但是,由于跟踪了每个赌博实例,因此该数据集中的丢失表示该人没有赌博。换句话说,缺失等于0。
问题/目标:
我想为缺失值(“NA”)估算0。 但是我只想在特定情况下这样做。具体来说,我想为我定义为参与者的“有效期”内的缺失值估算0,而其他所有条件均保持不变。
参与者的活跃期是从他们的第一个活跃月赌博到最后一个月赌博之间的每个月。例如,对于在第2、3、4和7个月赌博的参与者,我想在第5和6个月估算0。每隔一个月,即从1和9到70,我想保留为NA。我正在努力编写实现这一目标的代码。我是R的新手。
示例数据框和代码
下面是示例代码,该示例代码生成一个数据帧,该数据帧说明了我的问题中描述的关键特征。在此代码中,只有2个参与者,一个赌博行为变量和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)
reprex package(v0.3.0)创建于2020-03-28
# 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)
reprex package(v0.3.0)创建于2020-03-28

最佳答案

对于这个例子,我们假设每个玩家。 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))

关于r - 对于满足R中特定条件的情况,如何将缺失值替换为0?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60902133/

10-12 19:57