2017-11-27 46 views
5

Vì vậy, tôi có ma trận sau (chúng ta hãy gọi nó là đầu ra):Tạo ma trận mới trong R bằng cách tổng hợp các hàng của một ma trận

> output 

    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 1 1 0 0 1 
[2,] 1 1 1 0 0 1 
[3,] 1 1 1 0 0 1 
[4,] 0 0 0 0 0 0 
[5,] 1 0 1 1 0 0 
[6,] 1 0 1 1 0 0 

Những gì tôi muốn làm là để tạo ra một ma trận mới (output2) bằng cách thêm các hàng trong hai nhóm. Ví dụ hàng đầu tiên của ma trận mới sẽ là:

output2[1,] <- output[1,] + output[2,] 

Hàng thứ hai của output2 ma trận mới sẽ bao gồm tổng các hàng thứ ba và thứ tư của ma trận đầu ra cũ:

output2[2,] <- output[3,] + output[4,] 

Và cứ thế. Tôi đã tự hỏi cách tốt nhất để mã này là gì, xem xét tôi sẽ cần phải làm như vậy với ma trận lớn hơn. Tôi đã xem xét việc tạo các biến giả với hàm seq() và có thể là một vòng lặp for.

Có cách nào đơn giản hơn không?

Edit:

dput (đầu ra)

cấu trúc (c (1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0 , 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0), .Dim = c (10L, 19L))

+1

xin vui lòng gửi 'dput (yourMatrix) ' –

Trả lời

1

Nếu m là ma trận của bạn, hãy thử này:

m[seq(1,by=2,to=nrow(m)),]+m[seq(2,by=2,to=nrow(m)),] 
+0

Vâng, tôi nghĩ rằng tác phẩm cho những gì tôi đã có trong tâm trí! Cảm ơn rất nhiều! –

1

Những cả:

  • xử lý cả chẵn và lẻ số lượng hàng
  • khái quát để k hàng bằng cách thay thế 2 với k
  • ngắn - một dòng mã hoặc có thể dễ dàng được thực hiện một dòng
  • (1) chỉ sử dụng các chức năng cơ bản, tức là không có gói và (2) có thể dễ dàng khái quát hóa với các hàm khác ngoài tổng.

1) rowsum Sử dụng rowsum với một cuộc tranh luận thứ hai của c(1, 1, 2, 2, ..., 5, 5) đó là dễ dàng tạo ra sử dụng gl:

nr <- nrow(output) 
rowsum(output, gl(nr, 2, nr)) 

2) rollapply Một khả năng khác là sử dụng rollapply từ sở thú. Nếu chúng ta biết rằng số lượng hàng thậm chí chúng tôi có thể tùy chọn bỏ qua các đối số căn chỉnh và một phần.

library(zoo) 
rollapply(output, 2, by = 2, sum, align = "left", partial = TRUE) 
+0

Cả hai đều đang hoạt động tốt! Nhưng rollapply() có vẻ chậm hơn một chút. Cảm ơn bạn đã dành thời gian! –

1

Một lựa chọn khác là sử dụng vector tái chế:

matrix(output[c(TRUE, FALSE)] + output[c(FALSE, TRUE)], ncol = ncol(output)) 
+0

Giải pháp này cũng phù hợp với tôi. Cảm ơn đã giúp đỡ! –

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