Измените maxgap для количества раз, которое значение перенесено - PullRequest
0 голосов
/ 23 мая 2018

У меня есть фрейм данных, подобный следующему:

library(data.table)
test <- data.table(data.frame("value" = c(5,NA,8,NA,NA,8,6,NA,NA,10),
                              "locf_N" = c(1,NA,1,NA,NA,1,2,NA,NA,2)) )

В этом фрейме данных у меня есть переменная, которая указывает, сколько раз я мог перенести последнее наблюдение (locf_N).Это не фиксированное число для всех наблюдений.Я попытался использовать параметр maxgap в функции na.locf для этой цели, но на самом деле это не то, что я ищу.

require(zoo)
test[,value := na.locf(value, na.rm = FALSE, maxgap = 1)]
test[,value := na.locf(value, na.rm = FALSE, maxgap = locf_N)]

Есть ли какой-либо параметр, чтобы установить, сколько раз может быть перенесено последнее наблюдение?Любые идеи приветствуются.

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

output <- data.table(data.frame("value" = c(5,5,8,8,NA,8,6,6,6,10),
                                "locf_N" = c(1,NA,1,NA,NA,1,2,NA,NA,2)) )

1 Ответ

0 голосов
/ 23 мая 2018

cumsum(!is.na(value)) - это вектор группировки, который группирует каждый не-NA со следующими NA.Затем для каждой такой группы повторите первое значение требуемое количество раз и оставьте оставшиеся значения как NA.

test[, list(value = replace(value, 1:min(.N, locf_N[1] + 1), value[1]), locf_N), 
        by = cumsum(!is.na(value))][, -1]

, давая:

    value locf_N
 1:     5      1
 2:     5     NA
 3:     8      1
 4:     8     NA
 5:    NA     NA
 6:     8      1
 7:     6      2
 8:     6     NA
 9:     6     NA
10:    10      2
...