Я понял. Не корректно задачу описал. Простите. Там может быть несколько пропусков подряд. Кусок таблицы где пропущенные данные преобразовал уже в вектор. Пока всё равно цикл, но уже сильно быстрее.
Принцип простой - определяем группы строк по наличию отсутствующих значений таким образом, что полная строка всегда первая. Потом заполняем значения внутри каждой группы. Решение несколько наивное, потому что не предполагает работу с варьирующимся количеством переменных, но возможно в этом нет необходимости. Еще решение основывается на том факте, что значения либо отсутствуют во всем ряду (кроме первого столбика), либо нет. Если ситуация сложнее, надо ставить дополнительные условия для поиска NA.
Comments 9
Reply
> 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
Кусок таблицы где пропущенные данные преобразовал уже в вектор. Пока всё равно цикл, но уже сильно быстрее.
Reply
https://www.rdocumentation.org/packages/zoo/versions/1.7-13/topics/na.locf
Reply
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
Часть таблицы, где такое встречается в вектор, а дальше так:
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