Выберите один не 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 является комбинацией цифр и символов, и каждый класс столбцов необходимо поддерживать, поэтому применение вызывает проблемы. Также мне нужно, чтобы он возвращался как фрейм данных, а не как именованный вектор.

1 ответ

Решение

Попробуйте это и посмотрите, что вы ищете.

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) 
Другие вопросы по тегам