【问题标题】:ordering alpha numeric variable in r在 r 中排序字母数字变量
【发布时间】:2020-05-29 16:56:29
【问题描述】:

我想订购一个基于字母数字变量的数据框。我的数据集如下所示:

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

我需要按GradeItemID 订购,然后按包含字母数字的common.names 变量订购。

我用过这个:

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

有什么想法吗? 谢谢!

【问题讨论】:

  • 在您的示例数据中,1716_AS_SA1_Negative 相关联,1617_AS_2_B2 相关联。您是否尝试对行重新排序或单独对每一列进行排序?
  • 你是对的,对不起,我现在更正了。你现在能检查一下吗?感谢您的细心!
  • 我本来打算推荐gtools::mixedorder(),但它对于这种情况不够灵活......尽管它可能与separate()一起工作......
  • Ia 实际上尝试了gtools::mixedorder(),但这并没有提供预期的结果。感谢您的建议。

标签: r sorting alphanumeric


【解决方案1】:

使用orderbase R 解决方案以及涉及gsub 的更复杂的common.names 过程、正则表达式和多个反向引用以匹配可以对列进行排序的字符串中的数字:

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

【讨论】:

  • common.names 变量也需要订购。订单应以"16_AS_SA1_Negative","16_AS_SA3_Complete","16_AS_SA11_Prediction","16_AS_SA12_UnitMeaning".... 开头
  • 您的订单还是一样的。不知何故R 想以SA_1, SA_11, SA_12, then SA_3 订购它,但我想要SA_1, SA_3, SA_11, SA_12
  • 这个新编辑的解决方案怎么样?这对你有用吗?
  • 我们可以为G=17再做一轮吗,订单应该是"17_AS_2_B1","17_AS_2_B2","17_AS_4_D1","17_AS_5_C1"
  • 再次进行了编辑。现在输出似乎与您想要的输出完全匹配。这有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 2015-06-22
  • 2019-11-22
  • 1970-01-01
相关资源
最近更新 更多