Сортировка фрейма данных, в котором есть список

#r #shiny

#r #блестящий

Вопрос:

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

 new_df lt;- structure(list(ID = list(ID = "21", ID = "4"),   MET = structure(list(c("A", "B"), c("C", "D")), .Names = c("","")),   REGN = structure(list(c("ALL", "US"), "ALL"), .Names = c("", "")),   YEAR = list(YEAR = "2020", YEAR = "2020"),   WEEK = list(WEEK = c("12", "13", "14"), WEEK = "16"),   ANN = list(ANN = "Seller",ANN = "Rise")), row.names = 1:2, class = "data.frame")  

Но проблема в том , что я не в состоянии разобраться в этом. Если он попытается отсортировать, я получу ошибку ниже

 Error in rank(x, ties.method = "min", na.last = "keep") :   unimplemented type 'list' in 'greater'  

Комментарии:

1. Вы хотите отсортировать его, но по какому столбцу(столбцам) ?

2. Скажи «Удостоверение личности». На самом деле любая колонка. Если я также помещу эту таблицу DT блестящей, я не смогу сортировать, так как это список

3. Тип-список, потому что вы установили его сами или у вас нет контроля над этим ? Честно говоря, это немного раздражает-работать со списком внутри фрейма данных

4. Я нахожу столбцы списка гораздо более элегантными, чем альтернативы в определенных ситуациях, но много инструментов для упорядочения/анализа/обобщения/… все они основаны на том, что каждый столбец является вектором. Это, вероятно, верно для большинства утилит R-фреймов , но, прежде sort order всего, и rank всем нужны векторы в качестве входных данных.

Ответ №1:

Я не знаю, DT будет ли у этого способ сортировки list s, но я думаю, что вам нужно рассчитать порядок немного более подробно:

 new_df[order(sapply(new_df$WEEK, function(z) max(as.integer(z)))),] # ID MET REGN YEAR WEEK ANN # 1 21 A, B ALL, US 2020 12, 13, 14 Seller # 2 4 C, D ALL 2020 16 Rise  

Ключ — это передача векторов order . Также можно добавить заказ по нескольким столбцам (тай-брейкеры) с дополнительными sapply вызовами:

 new_df[order(  -sapply(new_df$WEEK, function(z) max(as.integer(z))),  sapply(new_df$MET, `[`, 1) ),]  

Обратите внимание, что каждый из sapply s может возвращать символ или число, но для того, чтобы выполнять сортировку по столбцам по убыванию, добавляя отрицательное значение (как в моих примерах выше), оно должно быть в какой-то форме числовым.