Сортировать столбцы большого Dataframe с разным количеством строк в порядке возрастания - PullRequest
0 голосов
/ 21 сентября 2018

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

Мой фрейм данных в R такой, но гораздо больше:

 D          I        S       ...

 111       2012     1000
 111       2012     2000
 111       2012     1000
 111       2014     2000
 111       2013     1000
 111       2013     2000

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

D     Count          I    Count           S    Count    ...

 111     6           2012      3          1000     3
                     2013      2          2000     3
                     2014      1  

А теперь я хочуотсортировать столбцы в порядке возрастания, чтобы получить такой кадр данных:

D     Count          S    Count           I    Count    ...

 111     6           1000      3          2012     3
                     2000      3          2013     2
                                          2014     1  

Я надеюсь, что кто-то может мне помочь.Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Хотите отсортировать столбцы по количеству уникальных экземпляров на столбец?Тогда это может сработать (при условии, что ваш фрейм данных здесь называется df):

ord <- order(sapply(df, function(col)length(unique(col))))
df[,ord]
0 голосов
/ 21 сентября 2018

Используя data.table, вы можете попробовать следующее.Для первой части:

data_set <- read.table(header = TRUE, text='D   I   S
111 2012    1000
111 2012    2000
111 2012    1000
111 2014    2000
111 2013    1000
111 2013    2000')

library(data.table)
lst <- lapply(c("D","I","S"), function(x) setDT(data_set)[, 
                                          .(Count = .N), by = x][order(-Count)])
[[1]]
     D Count
1: 111     6

[[2]]
      I Count
1: 2012     3
2: 2013     2
3: 2014     1

[[3]]
      S Count
1: 1000     3
2: 2000     3

А для второй части вы просто

lst[order(sapply(lst,dim)[1,])]

[[1]]
     D Count
1: 111     6

[[2]]
      S Count
1: 1000     3
2: 2000     3

[[3]]
      I Count
1: 2012     3
2: 2013     2
3: 2014     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...