Сортировка нескольких таблиц данных на основе столбца типа символов с проверкой работоспособности

У меня есть две таблицы данных, и я хочу отсортировать их так, чтобы значение строки первой таблицы было таким же, как значение строки второй таблицы на основе столбца с именем Parameter.

При использовании order() проблема заключается в том, что он будет сортировать только на основе ввода таблицы данных. Но чтобы убедиться, что обе таблицы данных не только отсортированы на основе столбца Parameter, но и отсортированы правильно, путем сравнения столбца Parameter построчно между двумя таблицами данных в качестве проверки работоспособности.

Пожалуйста, поделитесь любым более быстрым способом сделать это.

Ввод первой таблицы

Parameter   Data
R-1          1
R-2          1
R-3          1
P-11         1
P-12         1
P-8          2
P-9          1
P-10         1
R-4          1
R-5          1
P-14         1
P-15         1

Ввод второй таблицы

Parameter   Data
R-1          2
P-9          2
R-3          2
P-11         2
P-12         2
P-8          2
R-2          2
P-10         2
R-4          2
R-5          3
P-14         2
P-15         2

Желаемые результаты

Вывод первой таблицы

Parameter   Data
R-1         1
R-2         1
R-3         1
R-4         1
R-5         1
P-8         2
P-9         1
P-10        1
P-11        1
P-12        1
P-14        1
P-15        1

Вывод второй таблицы

Parameter   Data
R-1         2
R-2         2
R-3         2
R-4         2
R-5         3
P-8         2
P-9         2
P-10        2
P-11        2
P-12        2
P-14        2
P-15        2

person Chetan Arvind Patil    schedule 07.09.2019    source источник
comment
Звучит так, будто вы, возможно, захотите использовать какой-то вариант присоединения к dplyr?   -  person markhogue    schedule 07.09.2019


Ответы (1)


Вот подход с использованием dplyr и tidyr::separate.

library(dplyr); library(tidyr)

# Function to split up parameter into two pieces and sort like example
sort_table <- function(df) {
  df %>%  separate(Parameter, c("letter", "num"), remove = F) %>%
  arrange(desc(letter), as.numeric(num))
}

# Join the two sorted tables
full_join(
  sort_table(table_1),
  sort_table(table_2),
  by = c("Parameter", "letter", "num")
)



#   Parameter letter num Data.x Data.y
#1        R-1      R   1      1      2
#2        R-2      R   2      1      2
#3        R-3      R   3      1      2
#4        R-4      R   4      1      2
#5        R-5      R   5      1      3
#6        P-8      P   8      2      2
#7        P-9      P   9      1      2
#8       P-10      P  10      1      2
#9       P-11      P  11      1      2
#10      P-12      P  12      1      2
#11      P-14      P  14      1      2
#12      P-15      P  15      1      2
person Jon Spring    schedule 07.09.2019
comment
.@JonSpring - Прежде чем я увидел ваш ответ сегодня, вчера я применил аналогичный подход, используя separate(). Я думаю, что нет другого способа, кроме разделения, а затем сортировки по цифрам и буквам. - person Chetan Arvind Patil; 07.09.2019
comment
.@JonSpring - Возможно ли это сделать с базовым пакетом R? - person Chetan Arvind Patil; 11.09.2019
comment
Бьюсь об заклад, есть способ с strsplit и merge, но я также не знаю синтаксиса. - person Jon Spring; 12.09.2019
comment
.@JonSpring - Спасибо. Я сделал это с strsplit(). Пришлось скрыть выход list() на data.frame(). Это сработало. - person Chetan Arvind Patil; 12.09.2019