2013-12-03 2 views
0

Folks,R программирование: Объединение двух кадров данных

Я хотел бы объединить или объединить, если будет 2 кадра данных DF1 и df2. Моя цель так же проста, как создание нового фрейма данных, столбцы которого объединены с df1 и df2.

Пример

product=c("p1","p1","p1","p1","p1","p1","p1","p1","p2","p2","p2","p2","p2","p2","p2","p2","p3","p3","p3","p3","p3","p3","p3","p3","p4","p4","p4","p4","p4","p4","p4","p4") 
skew=c("b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a") 
version=c(0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2) 
color=c("C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2") 
price=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32) 

df1 = data.frame(product, skew, version) 
df2 = data.frame(product, skew, color, price) 

Мое желание, чтобы получить результаты, как показано ниже.

Я попробовал несколько вариантов:

#option 1 with cbind 
df <- cbind(df1,df2) 

Это возвращает dataframe дублируется столбцы «продукта» и «перекос».

# Option 2, use data.frame 
df <- data.frame(df1,df2) 

Это дало мне довольно много, что я хочу, за исключением того, что он имел дополнительные колонки для «продукта» и «перекос». Они имеют суффикс «.1», поэтому нет дубликата.

# option 3, use merge which seems to be the way to go 
df <- merge(df1,df2) 

Я думаю, что я что-то с слияния не хватает, потому что это на самом деле создал союз из всех набора данных, что в общей сложности 128 наблюдений из 32 при условии. Наверное, так работает слияние. Я запустил «? Merge» и попробовал несколько вариантов, но не мог заставить его плюнуть, что я хочу.

Так что мой вопрос:

Каков наилучший способ получить нужный мне dataframe из df1 и df2, как указано выше?

Thx заранее за вашу помощь! Riad.

 product skew version color price 
1  p1 b  0.1 C1  1 
2  p1 b  0.1 C2  2 
3  p1 b  0.2 C1  3 
4  p1 b  0.2 C2  4 
5  p1 a  0.1 C1  5 
6  p1 a  0.1 C2  6 
7  p1 a  0.2 C1  7 
8  p1 a  0.2 C2  8 
9  p2 b  0.1 C1  9 
10  p2 b  0.1 C2 10 
11  p2 b  0.2 C1 11 
12  p2 b  0.2 C2 12 
13  p2 a  0.1 C1 13 
14  p2 a  0.1 C2 14 
15  p2 a  0.2 C1 15 
16  p2 a  0.2 C2 16 
17  p3 b  0.1 C1 17 
18  p3 b  0.1 C2 18 
19  p3 b  0.2 C1 19 
20  p3 b  0.2 C2 20 
21  p3 a  0.1 C1 21 
22  p3 a  0.1 C2 22 
23  p3 a  0.2 C1 23 
24  p3 a  0.2 C2 24 
25  p4 b  0.1 C1 25 
26  p4 b  0.1 C2 26 
27  p4 b  0.2 C1 27 
28  p4 b  0.2 C2 28 
29  p4 a  0.1 C1 29 
30  p4 a  0.1 C2 30 
31  p4 a  0.2 C1 31 
32  p4 a  0.2 C2 32 

ответ

1

слияния() не работает так, как вы хотите, потому что ваши колонки «продукта» и «перекос» не существует никаких уникальных идентификаторов. Комбинации встречаются несколько раз. Таким образом, merge() вычисляет каждую возможную комбинацию. Вы можете включать в себя третий столбец в качестве идентификатора:

product=c("p1","p1","p1","p1","p1","p1","p1","p1","p2","p2","p2","p2","p2","p2","p2","p2","p3","p3","p3","p3","p3","p3","p3","p3","p4","p4","p4","p4","p4","p4","p4","p4") 
skew=c("b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a") 
version=c(0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2) 
color=c("C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2") 
price=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32) 
id = 1:32 

df1 = data.frame(product, skew, id, version) 
df2 = data.frame(product, skew, id, color, price) 
merge(df1, df2) 

Или вы объедините data.frames вручную:

cbind(df1, df2[, 3:4]) 
+0

Thx so much. Я пошел на второй вариант, так как я действительно не знаю, сколько строк у меня есть, 32 был просто примером, но может отличаться. Кроме того, в cbind я предпочел бы использовать имя. Поэтому, основываясь на ваших комментариях, я запустил: 'cbind (df1, df2 [, c (« цена »,« цвет »)])' и он выполнил эту работу! Thx снова для вашего быстрого ответа – Riad

2

Вы можете использовать union() но испортите имена столбцов.

df_c <- union(df1, df2) 
names(df_c) <- union(names(df1), names(df2)) 
df_c <- as.data.frame(df_c) 
+0

Yup, который работал как ожидалось. Хотелось бы, чтобы я сделал меньше шагов, но это сработало! Thx для вашего быстрого ответа, очень ценится! – Riad

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