2012-02-04 36 views
5

Rất tiếc, tôi không thể nghĩ ra một tiêu đề thông tin hơn, nhưng đây là thách thức của tôi. Tôi có một ma trận và tôi cần phải thêm các cột ở những vị trí cụ thể dựa trên các tham số được mô tả bởi một vectơ. Ví dụ: nếu tôi có ma trận sau:Làm cách nào để thêm cột để mở rộng ma trận trong R

1, 0, 1, 2, 0 
0, 0, 1, 1, 1 
1, 1, 0, 0, 0 
2, 0, 1, 0, 2 

nhưng đối với gói R cụ thể (không được đánh dấu), tôi cần thêm cột NA vào vị trí cụ thể. Tôi có một vector liên quan đến các cột trong ma trận:

1, 1, 1, 2, 3 

Điều này cho thấy các cột 1-3 từ cùng một khoảng thời gian lấy mẫu và cột 4 và 5 là từ các giai đoạn lấy mẫu khác nhau. Tôi cần phải làm cho số cột trong ma trận bằng số lượng tối đa từ cùng một khoảng thời gian lấy mẫu lần số lần lấy mẫu. Trong trường hợp này có ba số 1 (số lượng tối đa của bất kỳ giá trị duy nhất nào trong vectơ) và tổng cộng ba khoảng thời gian lấy mẫu (số tối đa trong vectơ). Vì vậy, tôi cần một ma trận với 9 cột (3 x 3). Cụ thể, tôi cần phải thêm các cột mới của NA sau cột thứ 4 và thứ 5. Về cơ bản, tôi chỉ cần các cột của NA là phần giữ chỗ để có một ma trận trong đó số lượng quan sát (mỗi cột) là giống nhau (= 3) cho mỗi giai đoạn mẫu (được biểu thị bằng số trong vectơ). Đây là khó khăn để mô tả nhưng trong ví dụ này tưởng tượng tôi muốn kết thúc với:

1, 0, 1, 2, NA, NA, 0, NA, NA 
0, 0, 1, 1, NA, NA, 1, NA, NA 
1, 1, 0, 0, NA, NA, 0, NA, NA 
2, 0, 1, 0, NA, NA, 2, NA, NA 

này sẽ được mô tả bởi một vector mà trông giống như:

1, 1, 1, 2, 2, 2, 3, 3, 3 

mặc dù tôi không thực sự cần để tạo ra vectơ đó, chỉ là ma trận. Rõ ràng, nó rất dễ dàng để thêm những cột trong trường hợp này, nhưng đối với dữ liệu của tôi tôi có một ma trận lớn hơn nhiều mà sẽ kết thúc với ~ 200 cột. Plus tôi có thể sẽ phải làm điều này cho nhiều tập hợp dữ liệu.

Bất cứ ai có thể giúp tôi với cách để mã này trong R để tôi có thể tự động hóa quá trình mở rộng ma trận?

Cảm ơn bạn đã được tư vấn hoặc đề xuất!


EDIT: để làm những điều tương tự hơn một chút để dữ liệu thực tế của tôi ở đây là một ma trận tái sản xuất và vector tương tự như những người hiện tại của tôi:

m <- matrix(rpois(120*26, 1), nrow = 120, ncol = 26) 
    v <- c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7) 
+0

OK, vì vậy bạn nói bạn không phải tạo ra vectơ và do đó nó chưa tồn tại ... bạn đã có thông tin nào cho biết thời gian lấy mẫu nào có nhiều cột nhất? Hoặc, bạn có biết đó là lần đầu tiên 3 và rằng nó chỉ đơn giản là một vấn đề của chèn hai cái mới sau mỗi cột bổ sung của 200 của bạn? – John

+0

Xin lỗi, tôi sẽ luôn biết từ việc lấy mẫu và tạo ma trận mà khoảng thời gian lấy mẫu có nhiều cột nhất và số lượng cột đó là bao nhiêu. Các cột đó sẽ luôn nằm kề nhau nhưng có thể xảy ra ở bất kỳ đâu trong ma trận. Bởi vì dễ dàng, tôi luôn có thể tạo ra véc-tơ đầu tiên, tôi chỉ có nghĩa là tôi không cần phải tạo vectơ thứ hai tương ứng với mối quan hệ cuối cùng vì nó sẽ luôn là bội số của các quan sát tối đa (cột) trong một giai đoạn chính . – djhocking

+1

Chỉ cần 'cbind (mat [, 1: 3], nas, nas, mat [, 4: 5]' (sử dụng định nghĩa 'nas' từ câu trả lời của Johns) sẽ làm cho các bộ nhỏ. Các giai đoạn lấy mẫu của bạn luôn được nhóm lại, không bao giờ bạn thấy '1,1,1,2,2,1,1,3,3'? Tôi đang nghĩ đến các hàm đơn giản để tạo ra các vị trí của các cột NA mới, đó là lý do tại sao tôi hỏi. cũng giống như yêu cầu những gì gói hoặc chức năng bạn đang gửi ma trận cuối cùng vào? Thường có một cách tốt hơn để lắp ráp dữ liệu của bạn nếu chúng ta biết những gì bạn cần để thực hiện.) –

Trả lời

4

Giả sử m là ma trận và v là vector, bạn có thể sử dụng giống như

t = table(v) 
size = dim(m)[1] * max(t) # size of each block based on the longest 
matrix(unlist(lapply(names(t), function(i) { 
       x = m[, v == i]     # get the short block 
       c(x, rep(NA, size - length(x))) # extend it to size 
     })), dim(m)[1]) 
+0

Làm việc một cách hoàn hảo, cảm ơn! – djhocking

1

Để sửa đổi ma trận cũng giống như bạn hỏi giả định ma trận là mat:

nr <- nrow(mat) 
nas <- rep(NA, nr) 
l <- lapply(4:ncol(mat), function(x) matrix(c(mat[,x],nas,nas), nrow = nr)) 
cbind(mat[,1:3], do.call(cbind,l)) 
Các vấn đề liên quan