Выберите один не 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)