2015-06-13 3 views
-3

У меня есть матрица в этом формате:сортировка месяца в матрице в R

year month Freq 
1 2014 April 466 
2 2015 April 59535 
3 2014 August 10982 
4 2015 August 0 
5 2014 December 35881 
6 2015 December 0 
7 2014 February 17 
8 2015 February 24258 
9 2014 January 0 
10 2015 January 22785 
11 2014 July  2981 
12 2015 July  0 
13 2014 June  1279 
14 2015 June  31356 
15 2014 March 289 
16 2015 March 40274 

Мне нужно сортировать месяцев на основе их возникновения т.е. января, февраль, март ... когда сортировать становится отсортированные по первому алфавиту. Я использовал это:

mat <- mat[order(mat[,1], decreasing = TRUE), ] 

и это выглядит следующим образом:

row.names April August December February January July June March May  November October September 
1 2015 59535 0  0   24258  22785 0  31356 40274 84211 0   0  0 
2 2014 466  10982 35881  17   0  2981 1279 289  879  8911  8565 4000 

Можно ли сортировать месяцев на основе вхождения в R?

+0

попробовать 'strptime' – mts

+0

@Colonel Я не могу иметь кадр данных, как я необходимо построить эту матрицу как тепловую карту, используя библиотеку решетки, которая не поддерживает фрейм данных. Я намеренно преобразовал фрейм данных в матрицу. –

+0

Dheeraj ... работайте над вашим data.frame, чтобы сначала получить желаемый результат, а затем преобразовать его в матрицу ... будьте осторожны, чтобы матрица имела один тип, поэтому ваш номер data.frame будет поврежден до символа, например ... –

ответ

1

Предположим, DF - это кадр данных, из которого вы получили свою матрицу. Мы предоставляем такой кадр данных в воспроизводимой форме в конце. Убедитесь, что month и year являются факторами с соответствующими уровнями. Обратите внимание, что month.name является встроенной переменной в R, которая используется здесь для обеспечения правильной сортировки уровней месяца, и мы предположили, что year является числовым столбцом. Затем используйте levelplot так:

DF2 <- transform(DF, 
     month = factor(as.character(month), levels = month.name), 
     year = factor(year) 
    ) 

library(lattice) 
levelplot(Freq ~ year * month, DF2) 

screenshot

Примечание: Вот в воспроизводимой форме DF?:

Lines <- " year month Freq 
1 2014 April 466 
2 2015 April 59535 
3 2014 August 10982 
4 2015 August 0 
5 2014 December 35881 
6 2015 December 0 
7 2014 February 17 
8 2015 February 24258 
9 2014 January 0 
10 2015 January 22785 
11 2014 July  2981 
12 2015 July  0 
13 2014 June  1279 
14 2015 June  31356 
15 2014 March 289 
16 2015 March 40274 " 
DF <- read.table(text = Lines, header = TRUE) 
0

Предполагая, что вы хотите отсортировать по времени (нужно добавить фиктивный день 1 преобразовать в формат времени):

time = strptime(paste(1, mat$month, mat$year), format = "%d %B %Y") 
mat = mat[sort.ind(time, index.return=T)$ix, ] 

Или, если вы не заботитесь о годе:

time = strptime(paste(1, mat$month, 2000), format = "%d %B %Y") 
mat = mat[sort.ind(time, index.return=T)$ix, ] 
+0

Я использовал первый код. Я получаю эту ошибку: Ошибка в mat $ month: оператор $ недействителен для атомных векторов. –

+0

сделать это 'time = strptime (paste (1, mat [, 2], mat [, 1]), format ="% d% B% Y ")' предполагаемый месяц - это второй столбец ваших данных. – mts

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