2015-10-15 1 views
1

Мне нужно переупорядочить столбцы огромного data.frame на основе двух условий. Первый - это фиксированный порядок, основанный на префиксах столбца (который я использую как категорию столбцов). внутри каждой категории заказ является алфавитным.Переупорядочение столбцов data.frame сначала по фиксированным порядкам подгрупп, затем по алфавиту внутри каждой подгруппы

Другими словами:

  • Сначала на фиксированном порядке на основе префиксов -> "" {без префикса}, "детали", "Атрибуты", "Статистика", "опрос", «конечной точки "

  • Затем внутри каждой подгруппы по алфавиту

Вот воспроизводимая data.set для игры:

blah <- data.frame("id"=1,               
        "details.thumbnail"=1,           
        "details.image"=1, 
        "type"=1,              
        "name"=1,            
        "attributes.num"=1,            
        "attributes.boardgamemechanic"=1,        
        "attributes.boardgameexpansion"=1,        
        "stats.averageweight.value"=1,         
        "poll.results.suggested_numplayers.7.Recommended.numvotes"=1, 
        "poll.results.suggested_numplayers.7.NotRecommended.numvotes"=1, 
        "attributes.boardgamemechanic"=1, 
        "endpoint.uri"=1) 

Я действительно озадачен, поскольку каждое решение, которое я пишу, действительно странно и окончательно не изящно.

tnx за помощь!

+0

1. вручную (я знаю, сегодня я чувствую себя хромой) 2. расщепление в подстроках с использованием регулярного выражения и переупорядочение любого блока (уродливый) –

ответ

1

Вот один из способов:

cols <- c("^([^.]+)$", "^(details)", "^(attributes)", "^(stats)", "^(poll)", "^(endpoint)") 
s <- names(blah) 
n <- seq_along(cols) 
for(i in n) s <- sub(cols[i], paste0(n[i], "\\1"), s) 
new_vec <- substr(s[order(s)], 2, nchar(s[order(s)])) 
new_vec 
# [1] "id"               
# [2] "name"              
# [3] "type"              
# [4] "details.image"            
# [5] "details.thumbnail"           
# [6] "attributes.boardgameexpansion"        
# [7] "attributes.boardgamemechanic"        
# [8] "attributes.boardgamemechanic.1"        
# [9] "attributes.num"            
# [10] "stats.averageweight.value"         
# [11] "poll.results.suggested_numplayers.7.NotRecommended.numvotes" 
# [12] "poll.results.suggested_numplayers.7.Recommended.numvotes" 
# [13] "endpoint.uri" 

Мы используем регулярное выражение для поиска приставок и без префиксов имен столбцов. Переменная cols создается в порядке, указанном в вопросе. Добавление числа для каждого поиска. Когда префикс не найден 1 прилагается, для details, 2 прилагается. И так далее. Я использую цикл for, так как он лучше всего используется для работы на одной итерации и сохранения результата для следующего. Это новый вектор имен. Затем номер, который был прикреплен, снимается для подмножества с blah[,new_vec].

+1

классный! он работает как прелесть (и очень элегантное использование этого префикса!). Tnx allot –

Смежные вопросы