2014-12-23 4 views
3

У меня есть длинная строка (извлеченные из XML), которые выглядят, как это (часть):R: разобрать строку матрицы

x <- "81 11780 26978 24271 6195\n92 13319 17032 233 16969\n98 17433 13883 6769 18086\n" 

Это фактически NX5 матрица целых чисел. Как я могу преобразовать эту строку в матрицу, которая в основном эффективна?

substr(x,26,26) возвращает "\n"

Я использую R 3.1.2 в Windows x64.

ответ

9

Использование scan:

matrix(scan(text = x),nrow = 3,byrow = TRUE) 
Read 15 items 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 81 11780 26978 24271 6195 
[2,] 92 13319 17032 233 16969 
[3,] 98 17433 13883 6769 18086 

Edited использовать byrow = TRUE, который, вероятно, что вы хотели.

+0

Большое спасибо много! Я использую только 'ncol = 5' вместо' nrow', так как число строк неизвестно вообще. – yuk

+1

@yuk - также стоит упомянуть, что если у вас есть все целочисленные значения, добавление 'what = integer()' to 'scan' сделает чтение намного быстрее при большом тексте. –

+0

Да, я делаю это. Благодарю. – yuk

1

Попробуйте это:

x.split <- gsub(x,"\n","") 
x.num <- as.numeric(x.split) 
x.matrix <- matrix(x.num,ncol=5,byrow=TRUE) 

Первая линия разделяет длинный символ вверх в вектор с одиночными номерами (по-прежнему в качестве символа). Следующая строка преобразуется в числовую, а последняя строка определяет матрицу.

2

read.table позволяет преобразовывать текст в data.frame:

df <- read.table(text=x) 

Чтобы получить matrix:

m <- as.matrix(df) 
1
x <- "81 11780 26978 24271 6195\n92 13319 17032 233 16969\n98 17433 13883 6769 18086\n" 
#generate data frame 
data <- read.csv(textConnection(x),sep=" ",header=F) 
#generate matrix 
data <- as.matrix(data) 
+0

Вау, это тоже отличный ответ! Я могу преобразовать непосредственно в кадр данных, а не в вектор. Благодаря! – yuk

+0

'textConnection (x)' может быть заменено на 'text = x'. Не знаю, быстрее ли это или нет. – yuk

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