2016-10-12 21 views
7

Tôi muốn lấy danh sách tọa độ. Đối với mọi vị trí trong tọa độ, tôi muốn gán 1 cho ma trận. Ma trận cuối cùng sẽ trông như thế này. Tôi muốn sử dụng một phương pháp vectorized nhanh thay vì một vòng lặp for.Chỉ định 1 trong ma trận từ danh sách tọa độ

> sample.matrix 
     A B C D E F G H I J K L M N O P Q R S T 
    A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    B 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
    C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    D 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
    E 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    F 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
    G 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    H 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 
    I 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    J 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
    K 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    L 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    M 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 
    N 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 
    O 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 
    P 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
    Q 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
    R 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 
    S 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    T 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

mẫu dữ liệu:

set.seed(15) 
    dat <- data.frame(x=sample(LETTERS[1:20], 15,set.seed(15)),y=sample(LETTERS[1:20], 15,set.seed(15)), stringsAsFactors = FALSE) 
    sample.matrix <- matrix(data=0, nrow = 20, ncol = 20, dimnames = list(LETTERS[1:20],LETTERS[1:20])) 

gì tôi đã cố gắng mà làm việc.

for (n in 1:15){ 
     sample.matrix[dat[n,]$x,dat[n,]$y] =1 
    } 

Điều tôi đã thử không hoạt động.

by(dat, 1:15, function(a.row){sample.matrix[a.row$x, a.row$y]=1}) 
+0

(upvoted) Các ví dụ có thể được cải thiện bằng cách sử dụng set.seed() để làm cho nó tái sản xuất . –

+0

cảm ơn, đã chỉnh sửa để bao gồm các mục nhập – polka

+0

Nhập các mục 'nrow (dat)' này trong các mục 'length (sample.matrix)' của một ma trận không đầy, dường như cũng thích hợp cho một lưu trữ thưa thớt - 'xtabs (~ factor (x, LETTERS [1:20]) + yếu tố (y, LETTERS [1:20]), dat, thưa thớt = TRUE) ' –

Trả lời

8

Đây là khía cạnh lập trình thú vị của ngôn ngữ. Trong R chúng ta có thể tập hợp con sử dụng một ma trận hai cột:

sample.matrix[as.matrix(dat)] <- 1 

Thông tin thêm về Phương thức hoạt động

Từ sự giúp đỡ cho ?Extract (văn bản in đậm là tôi nhấn mạnh):

Hình thức lập chỉ mục thứ ba thông qua ma trận số với một cột cho mỗi thứ nguyên: mỗi hàng của ma trận chỉ mục, sau đó chọn một phần tử đơn lẻ của mảng là và kết quả là một vectơ. Chỉ số âmkhông được phép trong ma trận chỉ mục. Giá trị NA và 0 là được phép: các hàng của ma trận chỉ mục có chứa số không được bỏ qua, trong khi các hàng chứa NA tạo ra NA trong kết quả.

Lập chỉ mục thông qua ma trận ký tự với một cột cho mỗi thứ nguyên là cũng được hỗ trợ nếu mảng có tên thứ nguyên. Như với số lập chỉ mục ma trận, mỗi hàng của ma trận chỉ mục chọn một phần tử đơn lẻ của mảng. Các chỉ số được đối sánh với kích thước thích hợp tên. NA được phép và sẽ tạo ra một NA trong kết quả. Các chỉ số chưa được đối sánh cũng như chuỗi rỗng ("") không được phép và sẽ dẫn đến lỗi.

Trong trường hợp của bạn, bạn có ma trận có các chữ cái đại diện cho tên thứ nguyên.

 x y 
[1,] "B" "C" 
[2,] "S" "S" 
[3,] "L" "B" 
[4,] "N" "L" 
[5,] "E" "G" 
[6,] "M" "A" 

Khi chúng tôi chèn ma trận này vào bộ ngoặc đơn [as.matrix(dat)], bộ đánh giá sẽ phát hiện ma trận và sử dụng loại đặc biệt của subsetting. Cột đầu tiên sẽ đại diện cho các hàng và cột thứ hai sẽ đại diện cho các cột.

head(sample.matrix) 
    A B C D E F G H I J K L M N O P Q R S T 
A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
B 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
D 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
E 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
F 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
+0

Đã thêm thẻ lập chỉ mục. Đây là một ví dụ hay. –

+2

Cảm ơn chúng tôi cũng nên xem xét việc tạo trang tài liệu với cả ví dụ về lập chỉ mục dạng số và tên. Ước gì tôi có nhiều thời gian hơn tôi nghĩ đây là khía cạnh độc đáo của ngôn ngữ. –

+0

Đồng ý. Tôi đã tìm thấy chỉ mục ma trận hai chiều theo tên (hàng, col) để trở thành tính năng hữu ích và biểu cảm. –

3

Bạn có thể sử dụng dcast từ data.table:

dat$z <- 1 
dcast(dat,x~y,fill=0, value="z") 

    x B C D G H I J K L M N O P Q T 
1 A 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 
2 B 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 
3 C 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 
4 D 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
5 F 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
6 H 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 
7 J 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 
8 K 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 
9 L 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
10 M 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
11 N 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
12 O 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 
13 Q 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
14 R 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
15 T 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 
+0

Đây là một giải pháp tuyệt vời. – polka

+3

Điều này tuy nhiên thả một bó toàn bộ các hàng và cột ra ngoài. – thelatemail

1

này quá hoạt động:

sample.matrix[t(apply(dat, 1, function(x) 
      c(which(dimnames(sample.matrix)[[1]]==x[1]), 
       which(dimnames(sample.matrix)[[2]]==x[2]))))] <- 1 

sample.matrix 
    A B C D E F G H I J K L M N O P Q R S T 
A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
B 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
D 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
E 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
F 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
G 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
H 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 
I 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
J 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
K 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
L 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
M 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 
N 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 
O 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 
P 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
Q 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
R 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 
S 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
T 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
Các vấn đề liên quan