Мы можем сделать gather
в «длинном» формате, сделать fill
, сгруппированные по номеру строки, а затем spread
вернуться в «широкий» формат
library(tidyverse)
rownames_to_column(d, 'rn') %>%
gather(key, val, -rn) %>%
group_by(rn) %>%
fill(val) %>%
spread(key, val) %>%
ungroup %>%
select(-rn)
# A tibble: 5 x 3
# c1 c2 c3
# <chr> <chr> <chr>
#1 a a a
#2 1 2 3
#3 2 2 4
#4 3 4 4
#5 4 5 6
илидругой вариант без изменения формы будет выполнять линейное заполнение с na.locf
library(zoo)
d %>%
mutate(c1 = as.character(c1)) %>%
pmap_dfr(., ~ na.locf(c(...)) %>%
as.list %>%
as_tibble)
Кроме того, если мы используем na.locf
, он запускается по столбцам, поэтому данные можно транспонировать и применять na.locf
напрямую
d[] <- t(na.locf(t(d)))
d
# c1 c2 c3
#1 a a a
#2 1 2 3
#3 2 2 4
#4 3 4 4
#5 4 5 6
Как упомянул в комментариях @ G.Grothendieck, для того, чтобы позаботиться об элементах NA в начале строки, используйте na.locf0
вместо na.locf