2015-01-13 3 views
1

Я работаю с матрицей, считанной из csv, которая содержит как числа, так и символы. Это меньше матрица, но в основном то, что я работаю с:Заказ символьной матрицы по числовому столбцу

[,1] [,2] [,3]   [,4] [,5] [,6] [,7] [,8] [,9] 
V2 "A" "1" "Sample X1" "34712" "39390" "38858" "38574" "38660" 
V3 "A" "2" "Sample X2" "35333" "39940" "40533" "39936" "40669" 
V4 "A" "3" "Sample X3" "33612" "39601" "38658" "39220" "39465" 
V5 "A" "4" "Sample X4" "34309" "39200" "38597" "39820" "40081" 
V6 "A" "5" "Sample X5" "33637" "39404" "40497" "39388" "40033" 
V7 "A" "6" "Sample X6" "35314" "39522" "40345" "38624" "40306" 
V8 "A" "7" "Sample X7" "35548" "39000" "41408" "38310" "39849" 
V9 "A" "8" "Sample X8" "33972" "39930" "39777" "39582" "39570" 
V10 "A" "9" "Sample X9" "34808" "39857" "39252" "39248" "38465" 
V11 "A" "10" "Sample X10" "34316" "39798" "39776" "39516" "38812" 
V12 "A" "11" "Sample X11" "34476" "38581" "39672" "38997" "38794" 
V13 "A" "12" "Sample X12" "36246" "38809" "37872" "38100" "36925" 
V14 "B" "1" "Sample X13" "33642" "40201" "40202" "39320" "40426" 
V15 "B" "2" "Sample X14" "33381" "40624" "40349" "41350" "40490" 
V16 "B" "3" "Sample X15" "34465" "42096" "41194" "40613" "40416" 
V17 "B" "4" "Sample X16" "33957" "41905" "42273" "40710" "40681" 
V18 "B" "5" "Sample X17" "33877" "42040" "42226" "40788" "41261" 
V19 "B" "6" "Sample X18" "33970" "41860" "41149" "41093" "40877" 
V20 "B" "7" "Sample X19" "34745" "42040" "40186" "40862" "41044" 
V21 "B" "8" "Sample X20" "34140" "41274" "39880" "40356" "40496" 
V22 "B" "9" "Sample X21" "33929" "40652" "41410" "40760" "40718" 
V23 "B" "10" "Sample X22" "33684" "39220" "40478" "41500" "40094" 
V24 "B" "11" "Sample X23" "33141" "41446" "41121" "40726" "41020" 
V25 "B" "12" "Sample X24" "33405" "38481" "37716" "38562" "38218" 
V26 "C" "1" "Sample X25" "71560" "86402" "85614" "84273" "83264" 
V27 "C" "2" "Sample X26" "72144" "86266" "88082" "87672" "87356" 
V28 "C" "3" "Sample X27" "71946" "90201" "89156" "88386" "88006" 
V29 "C" "4" "Sample X28" "71758" "89108" "88225" "86006" "88654" 
V30 "C" "5" "Sample X29" "71144" "86558" "88614" "87028" "88809" 
V31 "C" "6" "Sample X30" "70504" "89230" "88869" "86653" "86356" 
V32 "C" "7" "Sample X31" "67874" "88405" "84878" "84914" "85425" 
V33 "C" "8" "Sample X32" "70273" "87865" "87529" "87945" "86172" 

Я хотел бы отсортировать матрицу по второй колонке без заголовков так далее:

A 1 . . . 
B 1 
C 1 
A 2 
B 2 
C 2 
A 3 
. 
. 
. 
A 12 
B 12 
C 12 . . . 

Я осмотрелся и обнаружил, что вы можете использовать порядок:

data <- data[order(data[,2],] 

но выходит так:

A 1 . . . 
B 1 
c 1 
A 10 
B 10 
C 10 
A 11 
B 11 
C 11 
A 12 
B 12 
C 12 
A 2 
B 2 
C 2 
. 
. 
. 
A 9 
B 9 
C 9 . . . 

Это потому, что эта матрица является матрицей символов? Как мне сделать только второй столбцовый номер, чтобы я мог сортировать его на основе этого?

Благодаря

ответ

1

Имея свои данные в матрице плохая идея, если вы хотите, чтобы иметь сочетание классов (например, цифровой и символ) через столбцы. Вместо этого вы должны использовать dataframe.

В идеале, прочитайте данные в dataframe с помощью read.csv или read.table. В противном случае, принудите свою матрицу к кадру данных с as.data.frame.

Учитывая матрицу m (в вашем случае data):

d <- as.data.frame(m, stringsAsFactors=FALSE) 
d[, 3] <- as.numeric(d[, 3]) # coerce the relevant column to numeric 
d[order(d[, 3]), ] 

Обратите внимание, что вы могли порядок матрицы по желанию с m[order(as.numeric(m[, 3])), ], но в результате столбцы будут еще все быть character.

NB: Объяснение сортировочного поведения, что вы стали свидетелями, что для вектора символов, все, начиная с 1 (например, 10) предшествует 2.

+0

Спасибо за отзыв о data.frame, я был смущен тем, как иметь данные из нескольких классов. Есть ли способ изменить способ сортировки? Чтобы быть 1, 2, 3, 4, ..., 10, 11, 12? Или лучший способ просто вырезать эти ряды и положить их в конец? –

+0

@ ИльяЛедерман не уверен, что вы имеете в виду. Код, который я предоставил (d <- as.data.frame (данные); d [порядок (d [, 3]),] '), или' data [order (as.numeric (data [, 3])) ] ', должны оба заказать его, как вы хотели. – jbaums

+0

Я все еще получаю заказ как 1,10,11,12,2,3,4,5,9,7,8,9. Я делал это в сборе (данные, класс), и он говорит, что все является фактором. Я не совсем понимаю, что такое фактор. Я прочитал в csv как данные <-t (read.csv ("data.csv", header = FALSE, skip = 5)) [- 1,] , затем do данные <- as.data.frame (data) –

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