根据列中值的前缀对数据框进行排序

时间:2016-06-24 13:12:08

标签: r sorting

我是法国工程专业的学生,​​我正在R大学里做一个项目。我实际上是在寻找与我的数据库相关的特定内容。

我的数据库看起来像这样:

      id         grades     std_id               UID
     1004          1         1004        cm1_AZZ_005_LKJ_xxx
     1004          1         1004        cm1_AZZ_002_LKJ_xxx
     1004          0         1004        cm1_AZZ_005_LKJ_xxx
     1004          1         1004        cm1_AZZ_002_LKJ_xxx
     1004          0         1004        cm1_AZZ_002_LKJ_xxx
     1004          1         1004        cm1_AZZ_009_LKJ_xxx
     1004          1         1004        cm1_AZZ_002_LKJ_xxx
     7687          1         0897        cm1_XYZ_457_HGF_xxx
     7687          1         0897        cm1_XYZ_970_HGF_xxx
     7687          1         0897        cm1_XBZ_674_KGH_xxx
     7687          0         0897        cm1_XBZ_987_KGH_xxx
     7687          1         0897        cm1_XBZ_780_KGH_xxx
     ....        .....       ....               .....

我想使用列UID中的值对数据库进行排序。

我的数据库较大,UID内的值可能会低于数据库。

目前,我手动调整每个不同UID的间隔,但它显然无效:

list_002 <- new_items[1:7] 
list_003 <- new_items[8:9]
list_005 <- new_items[10:12]

正如您所看到的,我想使用UID的前缀而不是所有字符对数据库进行排序。

Prefix : cm1_AZZ, cm1_XYZ, cm1_XBZ

在我的数据库中,UID前缀始终为(cm1_AZZ,cm1_XYZ,cm1_XBZ),但后缀可能会更改。

我想根据UID后缀&#34;(cm1_AZZ,cm1_XYZ,cm1_XBZ)&#34;在3个不同的列表中对数据库进行排序。每个UID有3个不同的列表而不是不同的列表。

就像那样:

list_AAZ <- list()
list_XYZ <- list()
list_XBZ <- list()

list_AZZ <- cm1_AZZ_005      list_XYZ <- cm1_XYZ_457 
            cm1_AZZ_002                  cm1_XYZ_970
            cm1_AZZ_005
            cm1_AZZ_002
            cm1_AZZ_002
            cm1_AZZ_009
            cm1_AZZ_002

list_X4Z <- cm1_XBZ_674
            cm1_XBZ_987
            cm1_XBZ_780

感谢帮助我。抱歉我的英语很差。

1 个答案:

答案 0 :(得分:4)

使用splitsub即可:

# original answer (before question update):
# new_list <- split(df, sub("(cm1_\\d{3}).*", "\\1", df$UID))
# updated answer:
new_list <- split(df, sub("(cm1_[^_]+).*", "\\1", df$UID))

这将返回一个列表,其中每组UID组(不包括后缀)都是data.frame。

然后,您可以使用

访问元素
new_list$cm1_AZZ

new_list[[2]]