2010-08-23 2 views
1

У меня есть два data.frames в R, один из которых имеет два столбца, а другой из них имеет три столбца и где два столбца являются общими между два кадра. Рамка имеет такое же количество строк. Пример фреймов a и b приведен ниже. Мне нужно изменить порядок строк b, используя порядок строк в a. Обратите внимание, что в кадре b любая уникальная комбинация первых двух столбцов, id и lob, будет связана с уникальным значением в столбце val. Столбец id и lob, приведенный здесь, является фактором и символом, но я хотел бы, чтобы решение работало для любого типа данных.Переупорядочить один data.frame, используя два столбца из другого data.frame в R

Обратите внимание, что если бы мы рассмотрим случай, когда кадр праведный был столбец ID и кадр б только имел идентификатор и VAL столбцы, я бы сделать это с чем-то вроде

b[match(a$id,b$id),] 

К сожалению, я m не уверен, как выполнить то же самое, когда мне нужно заказать по двум столбцам.

: с

id lob 
1 1+ X 
2 3 X 
3 2 X 
4 1 X 
5 1 Y 
6 1+ Y 
7 1+ X 
8 3 X 
9 3 X 

б:

id lob val 
1 1+ X 1 
2 1+ Y 9 
3 1+ X 1 
4 3 X 5 
5 3 X 5 
6 3 X 5 
7 2 X 4 
8 1 X 3 
9 1 Y 2 

Я хочу, чтобы получить это:

id lob val 
1 1+ X 1 
2 3 X 5 
3 2 X 4 
4 1 X 3 
5 1 Y 2 
6 1+ Y 9 
7 1+ X 1 
8 3 X 5 
9 3 X 5 
+0

Является ли оно еще четким? Комбинация (id, lob), по-видимому, не однозначно определяет строку. – Aniko

+0

Aniko. Здесь могут быть повторяющиеся строки, но это не должно быть проблемой, так как это не проблема, если вы хотите отсортировать вектор чисел с повторяющимися значениями. Обратите внимание, что для любого заданного (id, lob) кортежа будет только одно значение для val; то есть вы не можете иметь (1+, X, 5) и (1+, X, 3). Если бы это было не так, это было бы проблемой. – Abiel

ответ

3

Попробуйте использовать пасту, чтобы объединить свой идентификатор и по центру в пределах вашего вызова функции слияния.

b[match(paste(a$id,a$lob), paste(b$id,b$lob)),] 


    id lob val 
1 1+ X 1 
4 3 X 5 
7 2 X 4 
8 1 X 3 
9 1 Y 2 
2 1+ Y 9 
1.1 1+ X 1 
4.1 3 X 5 
4.2 3 X 5 
+2

Существует небольшой риск создания поддельного соединения. Например: a.id = "a b", a.lob = "c", b.id = "a", b.lob = "b c". Но это может произойти только тогда, когда вы не знаете свои данные. – Marek

+1

Спасибо Брайан, ты решил мою проблему. Чтобы быть более безопасным, мы могли бы добавить уникальный разделитель для рассмотрения дела, о котором упоминает Марек. – Abiel

1

Вот еще один способ, пока спариваний в а и б идеально соответствуют друг другу:

b[order(b$id,b$lob), ][ order(order(a$id,a$lob)), ] 

Первое использование порядка сортирует-кадра данных с помощью идентификатора, и со столбцами, то второй набор (2 ордера) говорит о том, что порядок строк в b будет таким образом, что после сортировки будет отформатирован назад к исходному порядку.

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