用第一个非NA填充data.frame中的NA

时间:2019-01-27 18:26:05

标签: r replace na

我在数据帧中插入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 :(得分:2)

您可以将数据转换为长格式,然后使用pageStep()

singleStep()

输出:

na.locf

答案 1 :(得分:2)

({最重要的)使用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(出于明显的原因而排除了第一列)。

数据

dat <- data.frame(group,year1,year2,year3, stringsAsFactors = FALSE)