2016-06-22 4 views
2

У меня есть кадр данных c как этотЗаполнение NAs с dataframe сливаться

c 
      Freq  CTM 
000110100111 2  NA 
110110100111 1 32.58847 
111001011000 2  NA 
111111111111 1 25.61041 

и рамку nona_c данных как этот

nona_c 
      Freq  CTM 
000110100111 2 37.0642 
111001011000 2 37.0642 

Я хочу, чтобы заменить Nas в CTM колонке c с значениями CTM nona_c. Имена ростов nona_c (двоичные строки) всегда будут существовать в c.

Выход должен быть

mergedC 
      Freq  CTM 
000110100111 2 37.0642 
110110100111 1 32.58847 
111001011000 2 37.0642 
111111111111 1 25.61041 

Я пытался merge без успеха здесь.

mergedC <- merge(x = c, y = nona_c, by = 0, #rownames 
    all.y = TRUE) 
+3

как сторона примечания; странно видеть объект с именем 'c', особенно с учетом функции'? c'. Может вызывать проблемы. – SymbolixAU

ответ

4

match операция может сделать это более простым:

c$CTM[is.na(c$CTM)] <- nona_c$CTM[match(rownames(c)[is.na(c$CTM)], rownames(nona_c))] 

#    Freq  CTM   id 
#000110100111 2 37.06420 000110100111 
#110110100111 1 32.58847 110110100111 
#111001011000 2 37.06420 111001011000 
#111111111111 1 25.61041 111111111111 
2

Мы можем сделать это с помощью data.table объединения on переменной интереса. Здесь мы присоединяемся к столбцу имени строки. Значения «i.CTM» назначаются (:=) в «CTM».

library(data.table) 
setDT(c, keep.rownames=TRUE)[] 
setDT(nona_c, keep.rownames=TRUE)[] 

c[nona_c, CTM := i.CTM , on = "rn"] 
c 
#    rn Freq  CTM 
#1: 000110100111 2 37.06420 
#2: 110110100111 1 32.58847 
#3: 111001011000 2 37.06420 
#4: 111111111111 1 25.61041 

ПРИМЕЧАНИЕ: row.names не сохраняются в data.table или dplyr. Поэтому, преобразовывая 'data.frame' в 'data.table', мы используем keep.rownames = TRUE.

Смежные вопросы