2015-09-17 2 views
6

У меня есть dataframe (datadf) с 3 перевалами говорят х и г что-то вродеЗамена Nas в dataframe с константами в другом в R

x y z 
153 a 1 
163 b 1 
NA d 1 
123 a 2 
145 e 2 
NA c 2 
NA b 1 
199 a 2 

У меня Nas для многих значений X, Y и Z значения не являющиеся измеренные величины у меня есть другой dataframe (imputeddf) со значениями, чтобы использовать для заполнения Nas (каждый комбо Y и Z имеет свое собственное значение X для заполнения) т.е. что-то вроде этого (finaldf)

x y z 
123 a 1 
145 a 2 
124 b 1 
168 b 2 
123 c 1 
176 c 2 
184 d 1 
101 d 2 

Каков наилучший способ для меня f больные в САМ в данном ДФЕ с помощью моего вмененного значения ДФА

В результате я ищу это

x y z 
153 a 1 
163 b 1 
184 d 1 
123 a 2 
145 e 2 
176 c 2 
124 b 1 
199 a 2 

Я пытаюсь что-то вроде:

finaldf <- datadf 
finaldf$x <- if(datadf[!is.na(datadf$x)]){ddply(datadf, x=imputeddf$x[datadf$y == imputeddf$y & datadf$z == imputeddf$z])}else{datadf$x} 

но не DEF работает

+1

Возможно, пример с входом и выходом образца отформатирован? – user1357015

+1

Укажите требуемый фрейм данных, который должен быть приведен в примере. –

+0

k добавил мой желаемый результат, предоставленный col Z имеет более двух опций – user3337754

ответ

5

Я бы это сделал:

library(data.table) 
setDT(DF1); setDT(DF2) 

DF1[DF2, x := ifelse(is.na(x), i.x, x), on=c("y","z")] 

который дает

 x y z 
1: 153 a 1 
2: 163 b 1 
3: 184 d 1 
4: 123 a 2 
5: 145 e 2 
6: 176 c 2 
7: 124 b 1 
8: 199 a 2 

Комментарии. Этот подход не так велик, поскольку он объединяет целикомDF1, тогда как нам нужно объединить подмножество, где is.na(x). Здесь, улучшение выглядит (спасибо, @Arun):

DF1[is.na(x), x := DF2[.SD, x, on=c("y", "z")]] 

Этот способ аналогичен @ ответ RHertel в.

+0

Было бы неплохо, если бы data.table допускал 'DF1 [DF2, x [is.na (x)]: = ix, on = c (" y "," z ")]' – Frank

+1

Или 'dt1 [is.na (x), x: = dt2 [.SD, x, on = c ("y", "z")]] ' – Arun

3

Вот альтернатива с базовой R:

df1[is.na(df1$x),"x"] <- merge(df2,df1[is.na(df1$x),][,c("y","z")])$x 
> df1 
# x y z 
#1 153 a 1 
#2 163 b 1 
#3 124 b 1 
#4 123 a 2 
#5 145 e 2 
#6 176 c 2 
#7 184 d 1 
#8 199 a 2 
+1

, где у вас есть последовательность 2: 3, я могу заменить ее на c (df $ y, ДФ $ г)? – user3337754

+0

о том, когда df1 имеет несколько значений x (включая NA) для z == 1 & y == 1 – user3337754

+0

получение этой ошибки: ошибка в '[<-. Data.frame' (' * tmp * ', is.na (шаги dataimp $), «шаги», значение = c (NA,: замена имеет 17568 строк, данные имеют 2304 – user3337754