2014-08-11 5 views
2

Я хотел бы создать новый фрейм данных, который заимствует переменную ID из другого фрейма данных. Кадр данных, который я хотел бы объединить, имеет повторные наблюдения в столбце идентификатора, что вызывает некоторые проблемы.Слияние кадров данных с уникальным столбцом

DF1<-data.frame(ID1=rep(c("A","B", "C", "D", "E") , 2), X1=rnorm(10)) 
DF2<-data.frame(ID1=c("A", "B", "C", "D", "E"), ID2=c("V","W","X","Y" ,"Z"), X2=rnorm(5),  X3=rnorm(5)) 

Что я хотел бы добавить DF2 $ ID2 в DF столбцом ID1. Моя цель состоит в то, что выглядит как это (я не хочу DF2 $ X2 и DF $ X3 в «цели» кадра данных):

Goal<-data.frame(ID2=DF2$ID2, DF1) 

Я попытался объединения, но он жалуется, потому что DF1 $ ID1 не является уникальным , Я знаю, что R может показать это в одной строке кода, но я не могу заставить функции, которые я знаю, работать. Любая помощь будет принята с благодарностью!

ответ

3

Не должно быть проблем с простым слиянием. Используя данные выборки

merge(DF1, DF2[,c("ID1","ID2")], by="ID1") 

производит

ID1   X1 ID2 
1 A 0.03594331 V 
2 A 0.42814900 V 
3 B -2.17161263 W 
4 B -0.33403550 W 
5 C 0.95407844 X 
6 C -0.23186723 X 
7 D 0.46395514 Y 
8 D -1.49919961 Y 
9 E -0.20342430 Z 
10 E -0.49847569 Z 
+0

Или использовать матч просто захватить, что одну переменную 'DF1 $ ID2 <- df2 $ ID2 [match (DF1 $ ID1, DF2 $ ID1)] ' – thelatemail

+0

Вы правы @MrFlick это работает отлично :) Я пытаюсь сделать эту работу над реальными данными и создал этот простой манекен в качестве примера. Я должен был проверить, что эта простая команда слияния работала на мои данные примера, извините. Когда я попробовал этот код на своем реальном наборе данных, я вернулся «Ошибка в файле fix.by (by.y, y):« by »должен указывать однозначно допустимый столбец». Любая идея, что это сообщение об ошибке пытается мне сказать? – LoveMeow

+0

Похоже, что значение, которое у вас есть в 'by =', не соответствует столбцу как в data.frames, так и у вас есть data.frame с дублируемыми именами столбцов. – MrFlick

0

Вы также можете использовать left_join из library(dplyr)

library(dplyr) 
left_join(DF1, DF2[,c("ID1", "ID2")]) 
# ID1   X1 ID2 
#1 A -1.20927237 V 
#2 B -0.03003128 W 
#3 C -0.75799708 X 
#4 D 0.53946986 Y 
#5 E -0.52009921 Z 
#6 A 1.15822659 V 
#7 B -0.91976194 W 
#8 C 0.74620142 X 
#9 D -2.46452560 Y 
#10 E 0.80015219 Z 
Смежные вопросы