2013-04-05 30 views
6

Tôi là một người mới R nhiệt tình cần được giúp đỡ! :)Đếm số lượng các trường hợp mà một biến hoặc kết hợp các biến là TRUE

Tôi có một khung dữ liệu mà trông như thế này:

id<-c(100,200,300,400) 
a<-c(1,1,0,1) 
b<-c(1,0,1,0) 
c<-c(0,0,1,1) 

y=data.frame(id=id,a=a,b=b,c=c) 

đâu id là một định danh duy nhất (ví dụ như một người) và một, bc là giả biến cho dù người đó có tính năng này hay không (như thường lệ 1 = TRUE).

Tôi muốn R tạo ma trận hoặc khung dữ liệu trong đó tôi có các biến a, b và c cả hai như tên của các cột và của các hàng. Đối với các giá trị của ma trận R sẽ phải tính số lượng số nhận dạng có tính năng này hoặc kết hợp các đối tượng địa lý. Vì vậy, ví dụ, ID 100, 200 và 400 có tính năng sau đó trong đường chéo của ma trận nơi một và một chéo, R sẽ đầu vào 3. Chỉ ID 100 có cả hai tính năng a và b, do đó R sẽ nhập 1 nơi a và b chéo, và vv.

Khung dữ liệu kết quả sẽ phải trông như thế này:

l<-c("","a","b","c") 
m<-c("a",3,1,1) 
n<-c("b",1,2,1) 
o<-c("c",1,1,2) 
result<-matrix(c(l,m,n,o),nrow=4,ncol=4) 

Vì bộ dữ liệu của tôi có 10 biến và hàng trăm quan sát, tôi sẽ phải tự động hóa toàn bộ quá trình.

Trợ giúp của bạn sẽ được đánh giá cao. Cảm ơn rất nhiều!

Trả lời

8

Với cơ sở R:

crossprod(as.matrix(y[,-1])) 
# a b c 
# a 3 1 1 
# b 1 2 1 
# c 1 1 2 
+0

+1 Tôi yêu các giải pháp đơn giản và thanh lịch như –

+0

Thank này bạn rất nhiều Josh! –

+0

@NikolayNenov - Không sao cả. Tôi luôn đánh giá cao một câu hỏi được xây dựng tốt với một ví dụ tái sản xuất! Nếu câu trả lời của chúng tôi phù hợp với hóa đơn, bạn có thể "Chấp nhận" một trong số chúng (cả hai đều có vẻ chấp nhận được với tôi) bằng cách nhấp vào dấu kiểm ở bên trái. –

3

Đây được gọi là ma trận kề. Bạn có thể làm điều này khá dễ dàng với gói qdap:

library(qdap) 
adjmat(y[,-1])$adjacency 

## a b c 
## a 3 1 1 
## b 1 2 1 
## c 1 1 2 

Nó sẽ cảnh báo vì bạn đang cho nó khung dữ liệu. Không phải là một vấn đề lớn và có thể bỏ qua. Cũng nhận thấy tôi đã bỏ cột đầu tiên (ID) với chỉ mục tiêu cực y[, -1].

Lưu ý rằng vì bạn bắt đầu với một ma trận Boolean bạn có thể đã nhận được ở đó với:

Y <- as.matrix(y[,-1]) 
t(Y) %*% Y 
Các vấn đề liên quan