2011-12-14 2 views
1

У меня есть два набора данных и вы хотите их объединить. Как я добавляю к первому набору данных только строки, которые находятся во втором, которые не находятся в первом?Как объединить два набора данных по разным значениям в R?

Только добавьте к окончательному набору данных, если значение не существует в другом наборе данных. Пример набора данных:

x = data.frame(id = c("a","c","d","g"), 
       value = c(1,3,4,7)) 
y = data.frame(id = c("b","c","d","e","f"), 
       value = c(5,6,8,9,7)) 

Объединенный набор данных должен выглядеть (порядок не важен):

a 1 
b 5 
c 3 
d 4 
e 9  
f 7 
g 7 
+0

Просьба предоставить примерный набор данных. Это сделало бы намного меньше работы для нас, чтобы предоставить вам ответ ... –

+0

@PaulHiemstra Я добавил примерный набор данных. –

+1

Отредактировал свой вопрос, чтобы сделать примерный набор данных, пригодный для использования в R –

ответ

2

Использование !, %in% и rbind:

rbind(x[!x$id %in% y$id,], y) 
    id value 
1 a  1 
4 g  7 
3 b  2 
41 c  3 
5 d  4 
6 e  5 
7 f  6 
1

Вы уже ответили на ваш собственный вопрос, но сразу не понял этого. :)

> merge(x,y,all=TRUE) 
    id value 
1 a  1 
2 c  3 
3 c  6 
4 d  4 
5 d  8 
6 g  7 
7 b  5 
8 e  9 
9 f  7 

EDIT

Я немного густой здесь, и я не уверен, куда ты клонишь, так что я предоставить вам дробовик подход. Что я сделал, я объединил data.frames на id и скопировал значения от x до y, если у вас не было. Возьмите любую колонку, в которой вы нуждаетесь.

> x = data.frame(id = c("a","c","d","g"), 
+ value = c(1,3,4,7)) 
> y = data.frame(id = c("b","c","d","e","f"), 
+ value = c(5,6,8,9,7)) 
> xy <- merge(x, y, by = "id", all = TRUE) 
> xy 
    id value.x value.y 
1 a  1  NA 
2 c  3  6 
3 d  4  8 
4 g  7  NA 
5 b  NA  5 
6 e  NA  9 
7 f  NA  7 
> find.na <- is.na(xy[, "value.y"]) 
> xy$new.col <- xy[, "value.y"] 
> xy[find.na, "new.col"] <- xy[find.na, "value.x"] 
> xy 
    id value.x value.y new.col 
1 a  1  NA  1 
2 c  3  6  6 
3 d  4  8  8 
4 g  7  NA  7 
5 b  NA  5  5 
6 e  NA  9  9 
7 f  NA  7  7 

> xy[order(as.character(xy$id)), ] 
    id value.x value.y new.col 
1 a  1  NA  1 
5 b  NA  5  5 
2 c  3  6  6 
3 d  4  8  8 
6 e  NA  9  9 
7 f  NA  7  7 
4 g  7  NA  7 
+0

Я редактирую предоставленный мною набор данных, произошла ошибка. Идентификатор идентичен, но значения для одного и того же идентификатора отличаются. Я хочу объединиться только по письму. –

+0

Я думаю, что это еще что делает функция? Вы получаете несколько записей для «d» ... –

+0

Как вы справляетесь с этим, если у вас есть несколько таких переменных, имеющих одно и то же имя в двух сбиваемых наборах данных. Напр. если вы объединяете наборы данных в SAS, одноименные переменные легко объединяются в одну переменную. Есть ли простой способ сделать это в R тоже? – Shreyes

2

Для примера, чтобы работать, в первую очередь необходимо убедиться, что id в каждом data.frame непосредственно сопоставимы. Поскольку они являются факторами, вам необходимо убедиться, что они имеют одинаковые уровни/метки; или вы можете просто преобразовать их в символ.

# convert factors to character 
x$id <- as.character(x$id) 
y$id <- as.character(y$id) 
# merge 
z <- merge(x,y,by="id",all=TRUE) 
# keep first value, if it exists 
z$value <- ifelse(is.na(z$value.x),z$value.y,z$value.x) 
# keep desired columns 
z <- z[,c("id","value")] 
z 
# id value 
# 1 a  1 
# 2 b  5 
# 3 c  3 
# 4 d  4 
# 5 e  9 
# 6 f  7 
# 7 g  7 
Смежные вопросы