Есть ли способ заполнить вправо / влево вместо просто вниз / вверх с помощью dplyr? - PullRequest
3 голосов
/ 14 апреля 2019

Я ищу способ "заполнить" NA справа (в отличие от down / up) dplyr.Другими словами, я хотел бы преобразовать d в d2 без явной ссылки на какие-либо столбцы в вызове mutate.В моем реальном фрейме данных есть несколько десятков полей с разнесенными блоками NA, охватывающими переменное число столбцов.Мне интересно, есть ли краткий способ глобально наследовать первое не-NA значение слева, независимо от того, в каком поле оно встречается.

d<-data.frame(c1=c("a",1:4), c2=c(NA,2,NA,4,5), c3=c(NA,3,4,NA,6))
d2<-data.frame(c1=c("a",1:4), c2=c("a",2,2,4,5), c3=c("a",3,4,4,6))
d
d2

Ответы [ 2 ]

5 голосов
/ 14 апреля 2019

Мы можем сделать 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

2 голосов
/ 14 апреля 2019

Мы можем применить zoo::na.locf построчно, используя apply

d[] <- t(apply(d, 1, zoo::na.locf))

d
#  c1 c2 c3
#1  a  a  a
#2  1  2  3
#3  2  2  4
#4  3  4  4
#5  4  5  6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...