Переупорядочивание столбцов матрицы на основе определенного префикса в нескольких именах столбцов в R

У меня есть matrix в R с именами столбцов.

> colnames(m)
 [1] "caz_RNAi1_R1"     "caz_RNAi2_R1"     "cg1316_RNAi1_R1"  "cg1316_RNAi2_R1"  "cg4612_RNAi1_R1" 
 [6] "cg4612_RNAi2_R1"  "Dp1_RNAi1_R1"     "Dp1_RNAi2_R1"     "fmr1_RNAi1_R1"    "fmr1_RNAi2_R1"   
[11] "GFP_RNAi1_R1"     "GFP_RNAi2_R1"     "GFP_RNAi3_R1"     "GFP_RNAi4_R1"     "GFP_RNAi5_R1"    
[16] "GFP_RNAi6_R1"     "hrb87f_RNAi1_R1"  "hrb87f_RNAi2_R1"  "hrb98de_RNAi1_R1" "hrb98de_RNAi2_R1"

Теперь некоторые имена столбцов имеют префикс GFP. Я хочу переупорядочить столбцы матрицы так, чтобы столбцы, имеющие этот префикс в своих именах, были бы начальными столбцами, а остальные столбцы были бы расположены в алфавитном порядке между собой.

Таким образом, colnames(m) следует заказывать примерно так:

"GFP_a", "GFP_b", "GFP_c",..."GFP_z", "a", "b","c","d", ....

Как это сделать?


person hi15    schedule 13.04.2015    source источник
comment
Вы хотите смешанный порядок здесь, который упорядочит как символы, так и числа?   -  person David Arenburg    schedule 13.04.2015


Ответы (2)


Вы могли бы сделать

 m[order(-(grepl('^GFP', m))+1L)]

где m — из поста @Mamoun Benghezal. В примере он уже отсортирован по алфавиту, но если нет

 set.seed(24)
 m1 <-sample(m)
 m1[order(m1)][order(-(grepl('^GFP',m1[order(m1)]))+1L)]
person akrun    schedule 13.04.2015

ты можешь попробовать это

m <-  c("caz_RNAi1_R1", "caz_RNAi2_R1", "cg1316_RNAi1_R1", "cg1316_RNAi2_R1", "cg4612_RNAi1_R1",
        "cg4612_RNAi2_R1", "Dp1_RNAi1_R1", "Dp1_RNAi2_R1", "fmr1_RNAi1_R1", "fmr1_RNAi2_R1",
        "GFP_RNAi1_R1", "GFP_RNAi2_R1", "GFP_RNAi3_R1", "GFP_RNAi4_R1", "GFP_RNAi5_R1",
        "GFP_RNAi6_R1", "hrb87f_RNAi1_R1",  "hrb87f_RNAi2_R1",  "hrb98de_RNAi1_R1", "hrb98de_RNAi2_R1")
sort(m[grep(pattern="^GFP", x = m )]) # beginning with GFP
## [1] "GFP_RNAi1_R1" "GFP_RNAi2_R1" "GFP_RNAi3_R1" "GFP_RNAi4_R1" "GFP_RNAi5_R1" "GFP_RNAi6_R1"
sort(m[-grep(pattern="^GFP", x = m )]) # do not begin by GFP
##     [1] "caz_RNAi1_R1"     "caz_RNAi2_R1"     "cg1316_RNAi1_R1"  "cg1316_RNAi2_R1"  "cg4612_RNAi1_R1"  "cg4612_RNAi2_R1"  "Dp1_RNAi1_R1"     "Dp1_RNAi2_R1"     "fmr1_RNAi1_R1"    "fmr1_RNAi2_R1"   
##    [11] "hrb87f_RNAi1_R1"  "hrb87f_RNAi2_R1"  "hrb98de_RNAi1_R1" "hrb98de_RNAi2_R1"
c(sort(m[grep(pattern="^GFP", x = m )]),  sort(m[-grep(pattern="^GFP", x = m )])) # ordered columns
person Mamoun Benghezal    schedule 13.04.2015
comment
Здесь нет элемента заказа. - person David Arenburg; 13.04.2015
comment
Даже если в этом примере это не нужно, sort выполнит упорядочение столбцов. - person Mamoun Benghezal; 13.04.2015