2015-05-11 3 views
0

У меня есть кадр данных, который выглядит следующим образом:переплет dataframes по нескольким условиям в R

> data 
    Class Number 
1  A  1 
2  A  2 
3  A  3 
4  B  1 
5  B  2 
6  B  3 
7  C  1 
8  C  2 
9  C  3 

У меня есть кадр данных ссылки, которая:

> reference 
    Class Number Value 
1  A  1 0.5 
2  B  3 0.3 

Я хочу присоединиться к этим кадрам данных для создания единого фрейма данных:

> resultdata 
    Class Number Value 
1  A  1 0.5 
2  A  2 0.0 
3  A  3 0.0 
4  B  1 0.0 
5  B  2 0.0 
6  B  3 0.3 
7  C  1 0.0 
8  C  2 0.0 
9  C  3 0.0 

Как достичь этого? Любая помощь будет принята с благодарностью

+0

Вы попробовали 'merge'? – A5C1D2H2I1M1N2O1R2T1

+0

Я попробовал datadata <-merge (reference, data, by = c ("Class", "Number")) –

ответ

2

Вы можете сделать

library(data.table) 
setkey(setDT(reference), Class, Number)[data] 

Или

setkey(setDT(data), Class, Number)[reference, 
       Value:= i.Value][is.na(Value), Value:=0] 
# Class Number Value 
#1:  A  1 0.5 
#2:  A  2 0.0 
#3:  A  3 0.0 
#4:  B  1 0.0 
#5:  B  2 0.0 
#6:  B  3 0.3 
#7:  C  1 0.0 
#8:  C  2 0.0 
#9:  C  3 0.0 
2

Основной отправной точкой для этого будет merge.

merge(data, reference, all = TRUE) 
# Class Number Value 
# 1  A  1 0.5 
# 2  A  2 NA 
# 3  A  3 NA 
# 4  B  1 NA 
# 5  B  2 NA 
# 6  B  3 0.3 
# 7  C  1 NA 
# 8  C  2 NA 
# 9  C  3 NA 

Есть много вопросов, которые показывают, как заменить NA с 0.

2

Вы можете сделать:

library(dplyr) 
left_join(data, reference) %>% (function(x) { x[is.na(x)] <- 0; x }) 

Или (по @akrun предложению):

left_join(data, reference) %>% mutate(Value = replace(Value, is.na(Value), 0)) 

Что дает:

# Class Number Value 
#1  A  1 0.5 
#2  A  2 0.0 
#3  A  3 0.0 
#4  B  1 0.0 
#5  B  2 0.0 
#6  B  3 0.3 
#7  C  1 0.0 
#8  C  2 0.0 
#9  C  3 0.0