2012-01-24 43 views
6

Tôi có một khung dữ liệu gồm 9 cột bao gồm một danh sách các yếu tố. Mỗi hàng có thể có tất cả 9 cột được điền (như trong hàng đó đang giữ 9 "thứ"), nhưng hầu hết không (hầu hết đều có từ 3-4). Các cột không cụ thể, như trong mục 200 xuất hiện trong cột 1 và 3, nó cũng giống nhau. Tôi muốn tạo một ma trận là nhị phân cho mỗi hàng bao gồm tất cả các yếu tố.Cách tạo ma trận nhị phân của khoảng không quảng cáo trên mỗi hàng? (R)

Ex (rút ngắn xuống còn 4 cột chỉ để có được chỉ qua)

R1 3 4 5 8 
R2 4 6 7 NA 
R3 1 5 NA NA 
R4 2 6 8 9 

nên biến thành

 1 2 3 4 5 6 7 8 9 
r1 0 0 1 1 1 0 0 1 0 
r2 0 0 0 1 0 1 1 0 0 
r3 1 0 0 0 1 0 0 0 0 
r4 0 1 0 0 0 1 0 1 1 

Tôi đã nhìn vào writeBin/readBin, K-clustering (đó là điều mà tôi muốn làm, nhưng tôi cần phải loại bỏ các NA trước), phân cụm mờ, phân cụm từ khóa. Chỉ cần kinda bị mất về những gì hướng đi.

Tôi đã thử viết hai cho các vòng kéo dữ liệu từ ma trận theo cột/hàng và sau đó lưu 0 và 1 tương ứng vào ma trận mới, nhưng tôi nghĩ có vấn đề về phạm vi.

Các bạn là người giỏi nhất. Cảm ơn!

Trả lời

5

Dưới đây là một giải pháp cơ sở R:

# Read in the data, and convert to matrix form 
df <- read.table(text = " 
3 4 5 8 
4 6 7 NA 
1 5 NA NA 
2 6 8 9", header = FALSE) 
m <- as.matrix(df) 

# Create a two column matrix containing row/column indices of cells to be filled 
# with 'one's 
id <- cbind(rowid = as.vector(t(row(m))), 
      colid = as.vector(t(m))) 
id <- id[complete.cases(id), ] 

# Create output matrix 
out <- matrix(0, nrow = nrow(m), ncol = max(m, na.rm = TRUE)) 
out[id] <- 1 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
# [1,] 0 0 1 1 1 0 0 1 0 
# [2,] 0 0 0 1 0 1 1 0 0 
# [3,] 1 0 0 0 1 0 0 0 0 
# [4,] 0 1 0 0 0 1 0 1 1 
+0

+1 Bit cbind đó thổi tâm trí của tôi. –

+0

Josh, điều này thật ấn tượng. Có một thuật ngữ cho những gì được gọi là? Tôi đã suy nghĩ ma trận hàng tồn kho, ma trận mục, hoặc ma trận nhị phân, nhưng tất cả dường như liên quan đến các ý tưởng khác. –

+0

Cảm ơn. Tôi nghĩ * kết quả là ma trận chỉ thị (sau hàm [chỉ báo] (http://en.wikipedia.org/wiki/Indicator_function)) của ma trận hiện diện/vắng mặt (vì nó mã hóa có hay không mỗi mục có mặt hoặc vắng mặt trong một hàng nhất định). Tuy nhiên, không chắc chắn nếu có một tên chung được chấp nhận cho nó. –

3

này nên làm như lừa:

# The Incantation 
options(stringsAsFactors = FALSE) 

library(reshape2) 

# Your example data 
dat <- data.frame(id = c("R1", "R2", "R3", "R4"), 
        col1 = c(3, 4, 1, 2), 
        col2 = c(4, 6, 5, 6), 
        col3 = c(5, 7, NA, 7), 
        col4 = c(8, NA, NA, 9) 
) 

# Melt it down 
dat.melt <- melt(dat, id.var = "id") 

# Cast it back out, with the row IDs remaining the row IDs 
# and the values of the columns becoming the columns themselves. 
# dcast() will default to length to aggregate records - which means 
# that the values in this data.frame are a count of how many times 
# each value occurs in each row's columns (which, based on this data, 
# seems to be capped at just once). 
dat.cast <- dcast(dat.melt, id ~ value) 

Kết quả:

dat.cast 
    id 1 2 3 4 5 6 7 8 9 NA 
1 R1 0 0 1 1 1 0 0 1 0 0 
2 R2 0 0 0 1 0 1 1 0 0 1 
3 R3 1 0 0 0 1 0 0 0 0 2 
4 R4 0 1 0 0 0 1 1 0 1 0 
1

Đây là những câu trả lời tất cả tuyệt vời. Nghĩ rằng tôi sẽ đóng góp giải pháp ban đầu tôi đã viết rằng một người bạn của tôi đã sửa đổi để thực sự làm việc.

for(i in seq(nrow(x))) 
    for(j in seq(ncol(x))) 
    if(!is.na(x[i,j])) { y[i, x[i,j]] = 1 } 

Hai cho vòng hoạt động sau khi đặt một số thông số trước đó, nhưng cực kỳ chậm. Có vẻ như những giải pháp khác này hoạt động nhanh hơn nhiều!

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