расширить значение, чтобы заполнить пропущенные значения - PullRequest
0 голосов
/ 09 июня 2018

Я хочу заполнить пропущенное значение из первого не пропущенного значения и расширить его:

user   action
    1       NA
    1        2
    1       NA
    1       NA 
    1        3
    1       NA
    2       NA
    2       NA
    2        1
    2       NA

мой желаемый результат:

       user   action
        1        0
        1        2
        1        2
        1        2 
        1        3
        1        3
        2        0
        2        0
        2        1
        2        1

в основном, на основе user Я хочу заполнить значения NA.Он начинается с 0, а когда достигает следующего значения, он расширяется и заменяет "NA" s до следующего значения.это продолжается для каждого пользователя.

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

Решение с использованием dplyr, tidyr и функции replace.

library(dplyr)
library(tidyr)

dat2 <- dat %>%
  group_by(user) %>%
  fill(action) %>%
  ungroup() %>%
  replace(., is.na(.), 0)
dat2
# # A tibble: 10 x 2
#     user action
#    <int>  <dbl>
#  1     1      0
#  2     1      2
#  3     1      2
#  4     1      2
#  5     1      3
#  6     1      3
#  7     2      0
#  8     2      0
#  9     2      1
# 10     2      1

ДАННЫЕ

dat <- read.table(text = "user   action
    1       NA
                  1        2
                  1       NA
                  1       NA 
                  1        3
                  1       NA
                  2       NA
                  2       NA
                  2        1
                  2       NA",
                  header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 09 июня 2018

В базе R вы можете использовать ifelse для преобразования значений из NA в 0, а затем использовать cummax для выполнения скользящего расширения.ave выполнит группировку.

ave(ifelse(!is.na(dat$action), dat$action, 0), dat$user, FUN=cummax)
[1] 0 2 2 2 3 3 0 0 1 1

Обратите внимание, что это не будет работать, если ваши значения не монотонно увеличиваются.

0 голосов
/ 09 июня 2018

Используйте ave для обработки группировки, а затем na.locf0 для переноса последнего вхождения не-NA и na.fill для заполнения того, что осталось с 0.

library(zoo)

transform(DF, action = na.fill(ave(action, user, FUN = na.locf0), 0))

, давая:

   user action
1     1      0
2     1      2
3     1      2
4     1      2
5     1      3
6     1      3
7     2      0
8     2      0
9     2      1
10    2      1

Примечание

Ввод в воспроизводимой форме:

DF <- structure(list(user = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L
), action = c(NA, 2L, NA, NA, 3L, NA, NA, NA, 1L, NA)), 
class = "data.frame", row.names = c(NA, -10L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...