2016-04-27 3 views
0

У меня есть три кадра данных. Один «основной» кадр данных, к которому я хочу объединить два других кадра данных.Заполнить NAs в dataframe с совпадением объёма данных в R

main = data.frame(a = LETTERS[1:5], b = round(rnorm(5),2)) 

a  b 
A 0.41 
B -1.06 
C -0.65 
D -1.27 
E 1.03 

sub1 = data.frame(a = LETTERS[2:4], c = sample(c(100, 200, 300), 3, replace=T)) 

a c 
B 200 
C 200 
D 200 

sub2 = data.frame(a = LETTERS[c(1,5)], c = sample(c(999, 888), 2, replace=T)) 

a c 
A 999 
E 888 

В первом слиянии, я хочу, чтобы объединить sub1 в main через "a" и это работает.

merged1 = merge(main, sub1, by="a", all.x=T) 

a  b c 
A 0.41 NA 
B -1.06 300 
C -0.65 300 
D -1.27 100 
E 1.03 NA 

Теперь я хочу присоединиться/слить sub2 к merged1. В моем случае значения, указанные в sub2, заменяют NA в столбце c. В частности, я хочу заменить эти НС значениями от sub2. Я попытался это (и другие аргументы в пользу all.x, all.y:

merge(merged1, sub2, by="a", all.x=T) 

a  b c.x c.y 
A 0.41 NA 999 
B -1.06 300 NA 
C -0.65 300 NA 
D -1.27 100 NA 
E 1.03 NA 999 

Как я могу получить это только один столбец с с слияния

+2

Не могли бы вы 1) использовать набор номера семян при создании этих data.frames так, что они воспроизводимы. 2) быть последовательным в соглашениях об именах ... вы создаете кадры данных «sub1» и «main», но затем используйте «df_main» и «df_sub1» в слиянии. 3) проверьте свой пример на точность. Похоже, что df_sub1 и sub1 отличаются друг от друга, поскольку последний содержит 300, но первый содержит только 200. – AOGSTA

+0

Просто «rbind (df_sub1, df_sub2)» и сливайтесь с ним, а не отдельные небольшие слияния. Вам может потребоваться преобразовать столбцы факторов в символ, чтобы успешно «rbind». – Gregor

+0

Я думаю, что единственным другим вариантом является пост-процесс с функцией [coalesce-like] (http://stackoverflow.com/q/19253820/903061). – Gregor

ответ

4

Примечание: семена Мой был установлен, так что результаты отличаются от тех, в этом вопросе.

Если вы свяжете свой sUB1 или sUB2 вместе, вы можете сделать все это в одном объединении.

set.seed(42) 

main = data.frame(a = LETTERS[1:5], b = round(rnorm(5),2)) 

sub1 = data.frame(a = LETTERS[2:4], c = sample(c(100, 200, 300), 3, replace=T)) 

sub2 = data.frame(a = LETTERS[c(1,5)], c = sample(c(999, 888), 2, replace=T)) 

#Create one data frame 
all_sub <- rbind(sub1,sub2) 

merged <- merge(main, all_sub, by="a", all.x=T) 

Выход, как и ожидалось:

> merged 
    a  b c 
1 A 1.37 999 
2 B -0.56 200 
3 C 0.36 300 
4 D 0.63 300 
5 E 0.40 999 
Смежные вопросы