R - Как переставить целые строки, используя подмножество данных

Я провел построчное сравнение colB двух фреймов данных (оба фрейма данных имеют одинаковые упорядоченные столбцы). Я обнаружил, что они идентичны на 98%, и единственная разница между двумя столбцами заключалась в том, что некоторые пары значений были переключены следующим образом:

df1$colB   df2$colB
   A          B
   B          A
   1          1 
   C          D 
   D          C

Я взял подмножество, когда df1$colB не равно df2$colB

subset(df1, df1$colB != df2$colB)

Есть ли способ использовать вхождение строки из приведенного выше подмножества, чтобы переупорядочить все строки df1 так, чтобы все значения из df1$colB и df2$colB теперь совпадали?


person DAT BOI    schedule 24.03.2016    source источник
comment
Было бы полезно добавить больше шаблона (возможно, 10 строк) и еще несколько столбцов. Правильное решение зависит от шаблона, поэтому предоставление более подробной информации поможет.   -  person Pierre L    schedule 24.03.2016
comment
Вам нужно order их обоих. Обычный синтаксис - что-то вроде mtcars[order(mtcars$drat),], что вам нужно сделать для обоих. Соединения также возможны; dplyr::anti_join может быть особенно полезным.   -  person alistaire    schedule 24.03.2016
comment
Не совсем понятно, что вы хотите сделать, но merge может привести вас в правильном направлении?   -  person Ananta    schedule 24.03.2016
comment
Я упростил свой вопрос. Я просто хочу знать, как переставить целые строки фрейма данных, используя вхождение строки из подмножества данных.   -  person DAT BOI    schedule 24.03.2016


Ответы (1)


Я не думаю, что subset подходит для этого. Он ожидает логический вектор в качестве второго аргумента, (как ни странно) также названный «подмножество», и поэтому не имеет возможности упорядочивания. Вместо этого используйте match и [:

 df1[ match(df1$colB,  df2$colB), ]
  X1.5 colB
2    2    B
1    1    A
3    3    1
5    5    D
4    4    C

Но после тестирования с немного более сложной версией df2, у которой были NA и другие значения в colB, я решил, что предложение @ Ananta merge является более безопасным способом (но с df2 в качестве первого аргумента для получения желаемого порядка) :

> merge( df2,df1)[ names(df1) ]
  X1.5 colB
1    3    1
2    1    A
3    2    B
4    4    C
5    5    D
person IRTFM    schedule 24.03.2016