Заполнение NA в data.frame первым не NA - PullRequest
0 голосов
/ 27 января 2019

У меня есть определенные проблемы с вменением значений NA в кадре данных, как в следующих примерах.Мне нужно заменить отсутствующие данные в кадре данных первым не пропущенным значением в той же строке справа.Например, мои данные выглядят так:

group <-c('A','B','C','D','E','F','G')
year1<- c(NA,'100',NA,'200','300',NA,NA)
year2<- c(NA,'100',NA,'200','300','50','40')
year3<- c('20','100',10,'200','300','150','230')
data=data.frame(group,year1,year2,year3)

enter image description here

Но я хочу, чтобы это было как в окончательных данных:

group <-c('A','B','C','D','E','F','G')
year1<- c('20','100','10','200','300','50','40')
year2<- c('20','100','10','200','300','50','40')
year3<- c('20','100',10,'200','300','150','230')
finaldata=data.frame(group,year1,year2,year3)

enter image description here

Я понимаю, что есть функция na.locf(somevector, fromLast = TRUE), которая выполняет аналогичные функции, но я хочу, чтобы она была во всем фрейме данных строка за строкой?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Другой вариант, использующий (что наиболее важно) coalesce из dplyr

library(dplyr)
mutate_at(dat, 
          vars(starts_with("year")), 
          funs(replace(., is.na(.), do.call(coalesce, dat[-1])[is.na(.)])))
#  group year1 year2 year3
#1     A    20    20    20
#2     B   100   100   100
#3     C    10    10    10
#4     D   200   200   200
#5     E   300   300   300
#6     F    50    50   150
#7     G    40    40   230

Идея заключается в том, чтобы replace NA с для каждого столбца, который начинается с "года", на чторезультат do.call(coalesce, dat[-1]), то есть

[1] "20"  "100" "10"  "200" "300" "50"  "40" 

Это первые не NA s для каждой строки (первый столбец исключен по понятным причинам).

data

dat <- data.frame(group,year1,year2,year3, stringsAsFactors = FALSE)
0 голосов
/ 27 января 2019

Вы можете преобразовать данные в длинный формат и затем использовать na.locf:

library(tidyverse)

data %>%
  gather(key, value, year1:year3) %>%
  group_by(group) %>%
  mutate(value = zoo::na.locf(value, na.rm = FALSE, fromLast = TRUE)) %>%
  spread(key, value)

Выход:

# A tibble: 7 x 4
# Groups:   group [7]
  group year1 year2 year3
  <chr> <chr> <chr> <chr>
1 A     20    20    20   
2 B     100   100   100  
3 C     10    10    10   
4 D     200   200   200  
5 E     300   300   300  
6 F     50    50    150  
7 G     40    40    230 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...