2014-11-14 2 views
0

У меня есть следующий data.frame и преобразование в объект матрицы после удаления каждого разделителя.Преобразование странных data.frame в матрицу в R

> data 
    ID  COL1  COL2  COL3  COL4   COL5 
1 1  1,2,3,4  5,6,7,8 9,10,11,12 13,14,15,16 17,18,19,20 
2 2 11,12,13,14 15,16,17,18 19,20,21,22 23,24,25,26 27,28,29,30 
3 3 21,22,23,24 25,26,27,28 29,30,31,32 33,34,35,36 37,38,39,40 
4 4 31,32,33,34 35,36,37,38 39,40,41,42 43,44,45,46 47,48,49,50 
5 5 41,42,43,44 45,46,47,48 49,50,51,52 53,54,55,56 57,58,59,60 
6 6 51,52,53,54 55,56,57,58 59,60,61,62 63,64,65,66 67,68,69,70 
7 7 61,62,63,64 65,66,67,68 69,70,71,72 73,74,75,76 77,78,79,80 
8 8 71,72,73,74 75,76,77,78 79,80,81,82 83,84,85,86 87,88,89,90 
9 9 81,82,83,84 85,86,87,88 89,90,91,92 93,94,95,96 97,98,99,100 

===>

> data.new 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] 
1 1 1 2 3 4 5 6 7 8  9 10 11 12 13 14 15 16 17 18 19  20 
2 2 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29  30 
3 3 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39  40 
4 4 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49  50 
5 5 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59  60 
6 6 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69  70 
7 7 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79  80 
8 8 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89  90 
9 9 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 

Чтобы сделать это, какие функции из apply() я должен подать заявление?

Заранее спасибо Шон

ответ

3

Вам не нужно apply вообще. Вы можете перечитать данные. Попробуйте любую из этих трех возможностей.

В базовой R, (1) можно вставить столбцы вместе по строкам затем прочитать этот текст с read.csv

dc <- do.call(paste, c(data, list(sep = ","))) 
unname(as.matrix(read.csv(text = dc, header = FALSE))) 

Or, (2) с использованием scan непосредственно

matrix(scan(text = dc, what = integer(), sep = ","), length(dc), byrow = TRUE) 

Или (3) вы можете использовать cSplit из splitstackshape

library(splitstackshape) 
unname(as.matrix(cSplit(data, 2:6))) 
+0

Я уже дал этот свой +1, но также хотел поделиться тем, что использование 'cSplit_f' должно быть немного быстрее, чем' cSplit', когда известно, что данные будут прямоугольными. Я не уверен, что/как это изменится при переходе этих функций на использование «stringi». – A5C1D2H2I1M1N2O1R2T1

+0

Кроме того, если вы хотите добавить альтернативу 'fread',' x <- tempfile(); writeLines (do.call (paste, c (mydf, sep = ",")), x); Fread (х) '. – A5C1D2H2I1M1N2O1R2T1

2

раствор на основе apply:

t(apply(data, 1, function(x) as.numeric(unlist(strsplit(x, ","))))) 

Как это работает?

Функция apply используется для применения функции к каждой строке кадра данных. Символьные векторы разделяются запятыми (strsplit). Это возвращает список. Этот список преобразуется в вектор с unlist. Затем as.numeric используется для преобразования символьного вектора в числовой вектор. Функция apply возвращает матрицу, в которой столбец соответствует строке в исходном фрейме данных. Наконец, для переноса матрицы используется функция t.

+0

@ AndréDaniel См. Обновление. –

+0

Спасибо, намного лучше. –

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