2016-10-27 2 views
1

У меня есть этот data.frame:имен столбцов заказа в порядке возрастания в пределах dplyr цепи

df <- structure(list(att_number = structure(1:3, .Label = c("0", "1", 
                 "2"), class = "factor"), `1` = structure(c(2L, 3L, 1L), .Label = c("1026891", 
                                 "412419", "424869"), class = "factor"), `10` = structure(c(2L, 
                                                1L, 3L), .Label = c("235067", "546686", "92324"), class = "factor"), 
       `2` = structure(c(3L, 1L, 2L), .Label = c("12729", "7569", 
                 "9149"), class = "factor")), .Names = c("att_number", "1", 
                           "10", "2"), row.names = c(NA, -3L), class = "data.frame")  

Похоже, что это, имеющее число в качестве имен столбцов.

att_number 1   10  2 
     0 412419 546686 9149 
     1 424869 235067 12729 
     2 1026891 92324  7569 

В пределах dplyr цепи, я хотел бы заказать столбцы в порядке возрастания, как это:

att_number 1  2  10 
     0 412419 9149 546686 
     1 424869 12729 235067 
     2 1026891 7569 7569 

Я попытался с помощью select_, но он не хочет работать в соответствии с план. Любая идея о том, как я могу это сделать? Вот моя слабая попытка:

names_order <- names(df)[-1] %>% 
    as.numeric %>% 
    .[order(.)] %>% 
    as.character %>% 
    c('att_number', .) 

df %>% 
    select_(.dots = names_order) 

Error: Position must be between 0 and n 
+0

Почему не '[заказ (as.numeric (names (.)))] ' –

+0

Я хотел бы сохранить колонки, которые начинаются с буквы на LHS. Я могу сделать это, добавив еще один канал: 'select (att_number, everything())', но хотел бы избежать другого, если это возможно ... – maloneypatr

ответ

2

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

library(tidyverse) 

sort_names <- function(data) { 
    name <- names(data) 
    chars <- keep(name, grepl, pattern = "[^0-9]") %>% sort() 
    nums <- discard(name, grepl, pattern = "[^0-9]") %>% 
    as.numeric() %>% 
    sort() %>% 
    sprintf("`%s`", .) 

    select_(data, .dots = c(chars, nums)) 
} 

sort_names(df) 
Смежные вопросы