Заполнение пропущенных значений

Dec 18, 2018 14:57

Здравствуйте ( Read more... )

Leave a comment

Comments 9

5cr34m December 18 2018, 13:57:48 UTC
sapply с анонимной функцией.

Reply


sash_kan December 18 2018, 14:41:42 UTC
для вектора:

> v <- c(1,2,3,NA,5,6,NA)
> ifelse(is.na(v),c(NA,v[-(length(v))]),v)
[1] 1 2 3 3 5 6 6

ну и для таблицы аналогично:

> m <- matrix(ncol=5,1:25)
> m[c(2,5),2:5]<-NA
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 NA NA NA NA
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 NA NA NA NA
> ifelse(is.na(m),c(NA,m[-length(m)]),m)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 6 11 16 21
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 9 14 19 24

Reply

ittei December 18 2018, 15:02:27 UTC
Я понял. Не корректно задачу описал. Простите. Там может быть несколько пропусков подряд.
Кусок таблицы где пропущенные данные преобразовал уже в вектор. Пока всё равно цикл, но уже сильно быстрее.

Reply


tapka December 18 2018, 16:46:55 UTC

kovla December 18 2018, 17:30:37 UTC
Используя tidyverse:

library(tidyverse)

dat <- tribble(~a, ~b, ~c,
1, 1, 2,
2, NA, NA,
3, 5, 4,
8, NA, NA,
10, NA, NA)

dat %>%
mutate(flag = as.integer(!is.na(c)),
cs = cumsum(flag)) %>%
group_by(cs) %>%
mutate(b = first(b),
c = first(c)) %>%
ungroup() %>%
select(-flag, -cs)

Принцип простой - определяем группы строк по наличию отсутствующих значений таким образом, что полная строка всегда первая. Потом заполняем значения внутри каждой группы. Решение несколько наивное, потому что не предполагает работу с варьирующимся количеством переменных, но возможно в этом нет необходимости. Еще решение основывается на том факте, что значения либо отсутствуют во всем ряду (кроме первого столбика), либо нет. Если ситуация сложнее, надо ставить дополнительные условия для поиска NA.

Reply


ittei December 18 2018, 19:27:38 UTC
Спасибо всем откликнувшимся. Благодаря вам, сообразил.
Часть таблицы, где такое встречается в вектор, а дальше так:

v <- c(1,2,3,NA,5,6,NA,NA,3,4,3,NA,NA,5)
m <- which(is.na(v)==TRUE)
s <- which(is.na(v)==FALSE)
s <- sapply(m,function(x) min((x-s)[which((x-s)>0)]))
v[m] <- v[m-s]
v
[1] 1 2 3 3 5 6 6 6 3 4 3 3 3 5

и v преобразовать опять в таблицу

Reply


Leave a comment

Up