从多行中选择一个非NA

时间:2017-04-07 16:26:01

标签: r dataframe rows na

感到惊讶的是之前没有被问到(据我所知)

我有一个包含多列和两行的data.frame,如下所示。

df<-as.data.frame(rbind(row1=c(NA,NA,rep(0,2),"FOO",NA,"BAR","FOO","FOOBAR","ETC"),
                   row2=c(300,23.4,1,2,"BAR","FOO","BAR","HELLO","WORLD","ETC")))

我想在第一行中选择条目作为默认值,但前提是它不是NA。如果是NA我想要进入第二行。我尝试了以下内容:

apply(df,2,function(x) ifelse(is.na(x[1]),x[2],x[1]))

但是,x是数字和字符的组合,每个列类都需要维护,因此apply会导致问题。此外,我需要它作为数据框而不是命名向量返回。

1 个答案:

答案 0 :(得分:2)

试试这个,看看这是不是你想要的。

df<-as.data.frame(rbind(row1=c(NA,NA,rep(0,2),"FOO",NA,"BAR","FOO","FOOBAR","ETC"),
                        row2=c(300,23.4,1,2,"BAR","FOO","BAR","HELLO","WORLD","ETC")))


outDF <- lapply(df, function(x){
  if(is.na(x[[1]])&!is.na(x[[2]])){
    x[[1]] <- x[[2]]
  }
  x
})
data.frame(outDF, stringsAsFactors = FALSE)