2010-09-29 4 views

ответ

157

Либо прочитайте его с помощью «scan», либо просто сделайте as.vector() на матрице. Вы можете сначала перенести матрицу, если хотите ее по строкам или столбцам. Решения размещены до сих пор столь грубы я даже не буду пытаться их ...

> m=matrix(1:12,3,4) 
> m 
    [,1] [,2] [,3] [,4] 
[1,] 1 4 7 10 
[2,] 2 5 8 11 
[3,] 3 6 9 12 
> as.vector(m) 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 
> as.vector(t(m)) 
[1] 1 4 7 10 2 5 8 11 3 6 9 12 
+4

Это должно быть принятое решение, так как заголовок вопроса четко говорит о матричном вводе – C8H10N4O2

+0

, переносящем матрицу, является гением! – LostLin

9

От ?matrix: «Матрица - это частный случай двумерного массива». Вы можете просто изменить размеры матрицы/массива.

Elts_int <- as.matrix(tmp_int) # read.table returns a data.frame as Brandon noted 
dim(Elts_int) <- (maxrow_int*maxcol_int,1) 
+1

Чтение таблицы возвращает data.frame не матрицу. Будет ли это работать без as.matrix()? –

+0

@Brandon нет, он не будет; хороший улов! –

1

Вы можете использовать решение Джошуа, но я думаю, что вам нужно Elts_int <- as.matrix(tmp_int)

Или для петель:

z <- 1 ## Initialize 
counter <- 1 ## Initialize 
for(y in 1:48) { ## Assuming 48 columns otherwise, swap 48 and 32 
for (x in 1:32) { 
z[counter] <- tmp_int[x,y] 
counter <- 1 + counter 
} 
} 

г является 1d вектор.

27

Если мы говорим о data.frame, то вы должны задать сами переменные одного и того же типа? Если это так, то вы можете использовать rapply или unlist, так как data.frames списки, в глубине своей души ...

data(mtcars) 
unlist(mtcars) 
rapply(mtcars, c) # completely stupid and pointless, and slower 
+0

'unlist' работал для меня. –

23

попробовать c()

x = matrix(1:9, ncol = 3) 

x 
    [,1] [,2] [,3] 
[1,] 1 4 7 
[2,] 2 5 8 
[3,] 3 6 9 

c(x) 

[1] 1 2 3 4 5 6 7 8 9 
+0

Это вектор, а не 1-й массив. – hadley

+0

hmm. Это правда. Возможно, это не 1-й массив, а 1-й вектор. – Greg

10

array(A) или array(t(A)) даст вам 1-й массив.

1

Простой и быстрый поскольку 1d массив, по существу, вектор

vector <- array[1:length(array)] 
5

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

library(gdata) 
vector_data<- unmatrix(yourdata,byrow=T)) 

надежда, что поможет

1

Если у вас вместо этого есть data.frame (df), в котором было много столбцов, и вы хотите, чтобы векторизовать, вы можете сделать

as.matrix (df, ncol = 1)

+0

Это также сработает для матрицы. –

1

Вы можете использовать as.vector(). Похоже, это самый быстрый способ в соответствии с моей небольшой бенчмарк, следующим образом:

library(microbenchmark) 
x=matrix(runif(1e4),100,100) # generate a 100x100 matrix 
microbenchmark(y<-as.vector(x),y<-x[1:length(x)],y<-array(x),y<-c(x),times=1e4) 

Первое решение использует as.vector(), второй использует тот факт, что матрица хранится в виде непрерывного массива в памяти и length(m) дает количество элементов в матрице m. Третий создает array от x, а четвертый использует функцию конкатенации c(). Я также пробовал unmatrix от gdata, но здесь слишком медленно упоминаться.

Вот некоторые из численных результатов я получил:

> microbenchmark(
     y<-as.vector(x), 
     y<-x[1:length(x)], 
     y<-array(x), 
     y<-c(x), 
     times=1e4) 

Unit: microseconds 
       expr min  lq  mean median  uq  max neval 
    y <- as.vector(x) 8.251 13.1640 29.02656 14.4865 15.7900 69933.707 10000 
y <- x[1:length(x)] 59.709 70.8865 97.45981 73.5775 77.0910 75042.933 10000 
     y <- array(x) 9.940 15.8895 26.24500 17.2330 18.4705 2106.090 10000 
      y <- c(x) 22.406 33.8815 47.74805 40.7300 45.5955 1622.115 10000 

уплощение матрицы является обычной операцией в Machine Learning, где матрица может представлять параметры, чтобы узнать, но один использует алгоритм оптимизации с родовым библиотека, которая ожидает вектор параметров. Поэтому принято преобразовывать матрицу (или матрицы) в такой вектор. Это относится к стандартной функции R optim().

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