2016-07-17 38 views
7

Tôi muốn chuyển đổi ma trận giá trị thành ma trận 'bit'.cách chuyển đổi ma trận giá trị thành ma trận nhị phân

Tôi đã tìm kiếm các giải pháp và tìm thấy this, có vẻ như là một phần của giải pháp. Tôi sẽ cố gắng giải thích những gì tôi đang tìm kiếm. Tôi có một ma trận như

> x<-matrix(1:20,5,4) 
> x 
    [,1] [,2] [,3] [,4] 
[1,] 1 6 11 16 
[2,] 2 7 12 17 
[3,] 3 8 13 18 
[4,] 4 9 14 19 
[5,] 5 10 15 20 

mà tôi muốn chuyển đổi thành

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
    1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 
    2 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 
    3 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 
    4 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 
    5 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 

như vậy cho mỗi giá trị trong dòng "1" trong cột tương ứng.

Nếu tôi sử dụng

> table(sequence(length(x)),t(x)) 

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
    1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    3 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
    4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 
    5 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    6 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
    7 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
    8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 
    9 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    10 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 
    11 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
    12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 
    13 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    14 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
    15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
    16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 
    17 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    18 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 
    19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 
    20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 

này gần với những gì tôi đang tìm kiếm, nhưng trả về một dòng cho mỗi giá trị.

Tôi chỉ cần hợp nhất tất cả các giá trị từ một hàng thành một hàng. Bởi vì một

> table(x) 
x 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

cho alls giá trị của toàn bộ bảng, vì vậy những gì tôi cần phải làm để có được các giá trị cho mỗi hàng.

+1

gì nếu có hai số nguyên bình đẳng trong cùng hàng? – Julius

+0

Điều đó không có ý nghĩa. –

Trả lời

4

Dưới đây là một tùy chọn sử dụng table() chức năng:

table(row(x), x) 
# x 
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
# 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 
# 2 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 
# 3 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 
# 4 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 
# 5 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 
4
bit_x = matrix(0, nrow = nrow(x), ncol = max(x)) 
    for (i in 1:nrow(x)) {bit_x[i,x[i,]] = 1} 
4

Hãy

(x <- matrix(c(1, 3), 2, 2)) 
    [,1] [,2] 
[1,] 1 1 
[2,] 3 3 

Một cách tiếp cận sẽ

M <- matrix(0, nrow(x), max(x)) 
M[cbind(c(row(x)), c(x))] <- 1 
M 
#  [,1] [,2] [,3] 
# [1,] 1 0 0 
# [2,] 0 0 1 

Trong một dòng:

replace(matrix(0, nrow(x), max(x)), cbind(c(row(x)), c(x)), 1). 

Tiếp theo cách tiếp cận của bạn, và tương tự để đề nghị @ Psidom của:

01.235.
table(rep(1:nrow(x), ncol(x)), x) 
# x 
#  1 3 
# 1 2 0 
# 2 0 2 
3

Chúng tôi có thể sử dụng reshape2 gói.

library(reshape2) 
# At first we make the matrix you provided 
x <- matrix(1:20, 5, 4) 
# then melt it based on first column 
da <- melt(x, id.var = 1) 
# then cast it 
dat <- dcast(da, Var1 ~ value, fill = 0, fun.aggregate = length) 

mang đến cho chúng ta điều này

Var1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 
2 2 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 
3 3 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 
4 4 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 
5 5 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 
Các vấn đề liên quan