我在数据帧中插入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)
但是我希望它像最终数据一样:
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)
我知道有一个函数na.locf(somevector, fromLast = TRUE)
的功能与此类似,但是我希望在整个数据帧中逐行显示它吗?
谢谢!
答案 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)