порядок букв и цифр c переменная в r - PullRequest
1 голос
/ 29 мая 2020

Я хочу заказать фрейм данных на основе буквенно-цифровой переменной c. Вот как выглядит мой набор данных:

sample.data <- data.frame(Grade=c(4,4,4,4,3,3,3,3,3,3,3,3),
                          ItemID = c(15,15,15,15,17,17,17,17,16,16,16,16),
                          common.names = c("15_AS_SA1_Correct","15_AS_SA10_Correct","15_AS_SA2_Correct","15_AS_SA3_Correct",
                                            "17_AS_2_B2","17_AS_2_B1","17_AS_5_C1","17_AS_4_D1",
                                           "16_AS_SA1_Negative","16_AS_SA11_Prediction","16_AS_SA12_UnitMeaning","16_AS_SA3_Complete"))

> sample.data
   Grade ItemID           common.names
1      4     15      15_AS_SA1_Correct
2      4     15     15_AS_SA10_Correct
3      4     15      15_AS_SA2_Correct
4      4     15      15_AS_SA3_Correct
5      3     17             17_AS_2_B2
6      3     17             17_AS_2_B1
7      3     17             17_AS_5_C1
8      3     17             17_AS_4_D1
9      3     16     16_AS_SA1_Negative
10     3     16  16_AS_SA11_Prediction
11     3     16 16_AS_SA12_UnitMeaning
12     3     16     16_AS_SA3_Complete

Мне нужно упорядочить по Grade и ItemID, а затем по переменной common.names, содержащей буквенно-цифровые c.

Я использовал это:

sample.data.ordered <- sample.data %>%
  arrange(Grade, ItemID,common.names)

, но не для всего набора.

Мой желаемый результат:

> sample.data.ordered
   Grade ItemID           common.names
1      3     16     16_AS_SA1_Negative
2      3     16     16_AS_SA3_Complete
3      3     16  16_AS_SA11_Prediction
4      3     16 16_AS_SA12_UnitMeaning
5      3     17             17_AS_2_B1
6      3     17             17_AS_2_B2
7      3     17             17_AS_4_D1
8      3     17             17_AS_5_C1
9      4     15      15_AS_SA1_Correct
10     4     15      15_AS_SA2_Correct
11     4     15      15_AS_SA3_Correct
12     4     15     15_AS_SA10_Correct

Есть мысли? Спасибо!

1 Ответ

1 голос
/ 29 мая 2020

Решение base R, использующее order, а также более сложную процедуру для common.names, включающую gsub, регулярное выражение и множественную обратную ссылку для сопоставления чисел в строках, по которым можно упорядочить столбец:

sample.data[order(sample.data$Grade, 
              sample.data$ItemID, 
              as.numeric(gsub(".*(SA|AS_)(\\d+)_(\\w)?(\\d)?.*", "\\2\\4", sample.data$common.names))),]
   Grade ItemID           common.names
9      3     16     16_AS_SA1_Negative
12     3     16     16_AS_SA3_Complete
10     3     16  16_AS_SA11_Prediction
11     3     16 16_AS_SA12_UnitMeaning
6      3     17             17_AS_2_B1
5      3     17             17_AS_2_B2
8      3     17             17_AS_4_D1
7      3     17             17_AS_5_C1
1      4     15      15_AS_SA1_Correct
3      4     15      15_AS_SA2_Correct
4      4     15      15_AS_SA3_Correct
2      4     15     15_AS_SA10_Correct
...