Упорядочить кадр данных по именам столбцов

У меня есть такой кадр данных:

           G2_ref G10_ref G12_ref G2_alt G10_alt G12_alt
20011953      3      6      0      5       1     5    
12677336      0      0      0      1       3     6  
20076754      0      3      0     12      16     8 
2089670       0      4      0      1      11     9
9456633       0      2      0      3      10     0 
468487        0      0      0      0       0     0

И я пытаюсь отсортировать столбцы, чтобы, наконец, получить этот порядок столбцов:

G2_ref G2_alt G10_ref G10_alt G12_ref G12_alt

Я пытался: df[,order(colnames(df))]

Но у меня был такой порядок:

G10_alt G10_ref G12_alt G12_ref G2_alt G2_ref

Если у кого-то есть идеи, это будет здорово.


person Erika    schedule 01.02.2018    source источник
comment
Как был создан этот фрейм данных? Возможно, через dcast() или gather()?   -  person Uwe    schedule 01.02.2018


Ответы (3)


Одним из вариантов было бы извлечь числовую часть, а также подстроку в конце, а затем выполнить order

df[order(as.numeric(gsub("\\D+", "", names(df))), 
            factor(sub(".*_", "", names(df)), levels = c('ref', 'alt')))]
#          G2_ref G2_alt G10_ref G10_alt G12_ref G12_alt
#20011953      3      5       6       1       0       5
#12677336      0      1       0       3       0       6
#20076754      0     12       3      16       0       8
#2089670       0      1       4      11       0       9
#9456633       0      3       2      10       0       0
#468487        0      0       0       0       0       0

данные

df <- structure(list(G2_ref = c(3L, 0L, 0L, 0L, 0L, 0L), G10_ref = c(6L, 
0L, 3L, 4L, 2L, 0L), G12_ref = c(0L, 0L, 0L, 0L, 0L, 0L), G2_alt = c(5L, 
1L, 12L, 1L, 3L, 0L), G10_alt = c(1L, 3L, 16L, 11L, 10L, 0L), 
    G12_alt = c(5L, 6L, 8L, 9L, 0L, 0L)), .Names = c("G2_ref", 
"G10_ref", "G12_ref", "G2_alt", "G10_alt", "G12_alt"), 
   class = "data.frame", row.names = c("20011953", 
"12677336", "20076754", "2089670", "9456633", "468487"))
person akrun    schedule 01.02.2018
comment
Вот что он возвращает мне, когда я пишу вашу командную строку: head(rc[order(as.numeric(gsub("\\D+", "", names(rc))),factor(sub(".*_", "", names(rc)), levels = c('ref', 'alt')))]) integer(0) - person Erika; 01.02.2018
comment
@Erika Я предполагаю, что ваш набор данных data.frame (обновил набор данных, который я использовал). Если это матрица, используйте запятую, i,.e rc[, order(... - person akrun; 01.02.2018

Я предполагаю, что ваши данные получены из генетики и выглядят довольно стандартно, первые столбцы с аллелями ref для всех вариантов, затем следуют аллели alt для всех вариантов.

Это означает, что мы могли бы просто использовать альтернативный индекс столбца с половины вашего < em>dataframe, то есть: мы попытаемся создать этот индекс - c(1, 4, 2, 5, 3, 6) затем подмножество:

ix <- c(rbind(seq(1, ncol(df1)/2), seq(ncol(df1)/2 + 1, ncol(df1))))
ix
# [1] 1 4 2 5 3 6

df1[, ix]
#          G2_ref G2_alt G10_ref G10_alt G12_ref G12_alt
# 20011953      3      5       6       1       0       5
# 12677336      0      1       0       3       0       6
# 20076754      0     12       3      16       0       8
# 2089670       0      1       4      11       0       9
# 9456633       0      3       2      10       0       0
# 468487        0      0       0       0       0       0

# or all in one line
df1[, c(rbind(seq(1, ncol(df1)/2), seq(ncol(df1)/2 + 1, ncol(df1))))]
person zx8754    schedule 01.02.2018

Простое решение с использованием dplyr:

library(dplyr)
df <- df %>%
      select(G2_ref, G2_alt, G10_ref, G10_alt, G12_ref, G12_alt)

Возможно, это менее (сложный) код, чем ответ @akrun, но он действительно подходит только тогда, когда вы хотите заказать небольшое количество столбцов.

person tifu    schedule 01.02.2018
comment
Спасибо, но на самом деле это небольшой пример, у меня может быть больше 100 столбцов. - person Erika; 01.02.2018
comment
Если вы ищете более компактный и менее сложный, то df[c(1, 4, 2, 5, 3, 6)] и для этого вам не нужен пакет - person akrun; 01.02.2018
comment
Достаточно справедливо, но есть кое-что, что следует сказать о работе с именами столбцов, а не с номерами столбцов, особенно с точки зрения уменьшения источников ошибок. Я согласен, что ваш ответ - лучший путь. - person tifu; 01.02.2018