2015-12-31 3 views
0

Это немного странно, чтобы объяснить. У меня есть два кадра данных. Первая - эталонная, вторая может иметь или не иметь отсутствующих значений. Оба блока данных имеют одни и те же переменные. Если во втором фрейме есть NA, я хочу создать новый фреймворк на основе эталонных значений, но удалить эту переменную, которая отсутствует. Каждая нечетная и четная переменные связаны. Поэтому, если нечетная переменная имеет значение NA, эта переменная + следующая переменная должна быть удалена в новом фреймворке данных. Если существует четная переменная с значением NA, переменная + предыдущая переменная должна быть удалена. Таким образом, var 1 и var 2 связаны между собой, var 3 и var 4, var 5 и var 6 и т. Д. Более или менее я работаю, но у моего кода возникают проблемы со значениями NULL.Попытка создания новых кадров данных с использованием ссылочного фрейма данных на основе значений NA от другого

is.odd <- function(x) x %% 2 == 1 
apply(new, 1, function(x) { 

    if(is.odd(which(is.na(x)))) { 
     toremove=c(which(is.na(x)), which(is.na(x))+1) 
    } 

    if(!is.odd(which(is.na(x)))) { 
     toremove=c(which(is.na(x)), which(is.na(x))-1) 
    } 

    ref[,!(1:ncol(ref) %in% toremove), drop=F] 
}) 

Ошибка я получаю "Ошибка если (is.odd (который (is.na (х)))) {: аргумент длина нуля".

Вот пример того, что я хочу. Первая ссылка dataframe:

var1 var2 var3 var4 
1 q  w  e  r 
2 t  y  u  i 
3 o  p  a  s 
4 d  f  g  h 

второй имеет отсутствующие значения НС:

var1 var2 var3 var4 
1 1  1  1  1 
2 1  3  2  NA 
3 1  NA  a  s 
4 d  f  g  h 

Каждая строка второго dataframe используется для создания нового dataframe, основываясь на эталонных значений. Для первой строки вывод должен быть полным, поскольку нет NAs:

var1 var2 var3 var4 
1 q  w  e  r 
2 t  y  u  i 
3 o  p  a  s 
4 d  f  g  h 

Для второй строки вывод должен отсутствовать 3-й и 4-й переменной, так как 4-й имел NA и 3 + 4 (нечетное + четное) относятся к. :

var1 var2  
1 q  w  
2 t  y  
3 o  p  
4 d  f  

Обновление: Я думаю, что проблема, с которой (is.na (х) возвращение числовой (0) Я пытаюсь контролировать для этого с:.

if(!identical(which(is.na(x))), numeric(0)) {} 

Но это Безразлично «т, кажется, соответствие.

+0

Вы должны, по крайней мере, ссылка на предыдущий пост, так как я ответил на вопрос, есть и дайте мне знать вы задавали новый вопрос: http://stackoverflow.com/questions/34537091/comparing-two-data-frames-and-deleting-rows-based-on-na-values-in-one-data-frame – fishtank

+0

@ fishtank жаль, что не связывал предыдущий пост. Ваш ответ оказался самым простым решением. – JJL

ответ

0

Мы можем попробовать

apply(df2, 1, function(x) {if(all(!is.na(x))) 
         df1 else { 
          i1 <- which(is.na(x)) 
         df1[-c(sapply(i1, function(i) 
         if(!i%%2) c(max(1, i-1), i) 
         else c(i, min(length(x), i+1))))] 
           } 
           } 
          ) 

#$`1` 
# var1 var2 var3 var4 
#1 q w e r 
#2 t y u i 
#3 o p a s 
#4 d f g h 

#$`2` 
# var1 var2 
#1 q w 
#2 t y 
#3 o p 
#4 d f 

#$`3` 
# var3 var4 
#1 e r 
#2 u i 
#3 a s 
#4 g h 

#$`4` 
# var1 var2 var3 var4 
#1 q w e r 
#2 t y u i 
#3 o p a s 
#4 d f g h