2010-09-29 108 views

Trả lời

157

Hoặc đọc bằng 'quét' hoặc chỉ thực hiện thao tác as.vector() trên ma trận. Bạn có thể muốn chuyển đổi ma trận đầu tiên nếu bạn muốn nó theo hàng hoặc cột. Các giải pháp được đăng cho đến nay rất tổng Tôi thậm chí không đi để thử chúng ...

> 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

Đây phải là giải pháp được chấp nhận, vì tiêu đề câu hỏi cho biết rõ ràng đầu vào ma trận – C8H10N4O2

+0

transposing ma trận là thiên tài! – LostLin

9

Từ ?matrix: "Ma trận là trường hợp đặc biệt của mảng hai chiều". Bạn chỉ có thể thay đổi kích thước của ma trận/mảng.

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

Đọc bảng trả về dữ liệu.không phải là ma trận. Điều này vẫn sẽ làm việc mà không có as.matrix()? –

+0

@ Brandon không có nó sẽ không; nắm bắt tốt! –

1

Bạn có thể sử dụng giải pháp của Giô-suê nhưng tôi nghĩ rằng bạn cần Elts_int <- as.matrix(tmp_int)

Hoặc cho vòng:

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 
} 
} 

z là một vector 1d.

27

Nếu chúng ta đang nói về data.frame, sau đó bạn nên tự hỏi mình là các biến cùng loại? Nếu đó là trường hợp, bạn có thể sử dụng rapply, hoặc không công khai, vì data.frames là danh sách, trong sâu thẳm trong tâm hồn họ ...

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

'unlist' làm việc cho tôi. –

23

thử 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

Đó là một vectơ chứ không phải mảng 1-d. – hadley

+0

hmm. Đung. Có lẽ không phải là mảng 1-d, mà là một véc tơ 1 chiều. – Greg

10

array(A) hoặc array(t(A)) sẽ cung cấp cho bạn mảng 1-d.

1

đơn giản và nhanh chóng kể từ khi một mảng 1d về cơ bản là một vector

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

Nó có thể là quá muộn, dù sao đây là cách của tôi trong việc chuyển đổi Matrix để vector:

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

hy vọng rằng sẽ giúp

1

Nếu thay vào đó bạn có data.frame (df) có nhiều cột và bạn muốn vector hóa, bạn có thể làm

as.matrix (df, ncol = 1)

+0

Điều này cũng sẽ làm việc cho một ma trận. –

1

bạn có thể sử dụng as.vector(). Có vẻ như nó là phương pháp nhanh nhất theo chuẩn nhỏ của tôi, như sau:

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) 

Các giải pháp đầu tiên sử dụng as.vector(), thứ hai sử dụng thực tế là một ma trận được lưu giữ như một mảng kề nhau trong bộ nhớ và length(m) cung cấp cho các số phần tử trong ma trận m. Giá trị thứ ba khởi tạo một array từ x và thiết bị thứ tư sử dụng chức năng ghép nối c(). Tôi cũng đã thử unmatrix từ gdata, nhưng quá chậm để được đề cập ở đây.

Dưới đây là một số kết quả số tôi đắc:

> 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 

cầu dẹt một ma trận là một hoạt động phổ biến ở Machine Learning, nơi một ma trận có thể biểu diễn các thông số để tìm hiểu nhưng có ai sử dụng một thuật toán tối ưu hóa từ một generic thư viện dự kiến ​​một vectơ tham số. Vì vậy, nó là phổ biến để biến đổi ma trận (hoặc ma trận) thành một vectơ như vậy. Đó là trường hợp với hàm R tiêu chuẩn optim().

Các vấn đề liên quan