2011-11-05 20 views
6

Tôi muốn tạo một vector được gọi là kết hợp gồm các tệp nhị phân. Tất cả các số phải bằng 0 trừ khi các phần tử thuộc cùng một biến.Làm thế nào để tạo một vector nhị phân với 1 nếu các phần tử là một phần của cùng một véc-tơ?

Dưới đây là một ví dụ:

dataset=("a","b","c","d","x","y","z") 
var1=c("a","b","y","z") 
var2=c("c","d","x") 

Vì vậy, tôi có một bộ dữ liệu với tất cả các biến trong dòng đầu tiên. Bây giờ tôi tạo hai nhóm: var1 và var2.

Các vector phù hợp cho yếu tố "a" là nghĩa vụ phải trông giống như:

matching_a=c(1,1,0,0,0,1,1) 

Các con số tương ứng với dữ liệu của tôi. Nếu các biến trong tập dữ liệu của tôi nằm trong cùng một nhóm, thì phải có 1 trong vector phù hợp của tôi và 0 trong số khác.

Tuy nhiên, tập dữ liệu thực tế của tôi quá lớn để thực hiện thủ công. Có ai hiểu tôi muốn làm gì không?

Trả lời

4

Sử dụng chức năng ifelse%in% nhà điều hành.

matching_a <- ifelse(dataset %in% var1, 1, 0) 

matching_a 
# [1] 1 1 0 0 0 1 1 
4
> output1 = 1 * dataset %in% var1 
> output2 = 1 * dataset %in% var2 
> output1 
[1] 1 1 0 0 0 1 1 
> output2 
[1] 0 0 1 1 1 0 0 

Ngoài ra, nếu bạn có nhiều trận đấu hơn để làm hơn var1var2, nó sẽ có ích mở rộng này để một cái gì đó như:

> vars = list(var1, var2) 
> 1 * sapply(vars, function(x) dataset %in% x) 
    [,1] [,2] 
[1,] 1 0 
[2,] 1 0 
[3,] 0 1 
[4,] 0 1 
[5,] 0 1 
[6,] 1 0 
[7,] 1 0 
3

Tôi thấy rằng John Colby có đã đi theo con đường tôi định đề nghị, nhưng tôi nghĩ tôi sẽ nói rõ hơn.

Hàm dyadic %in% trả về một vectơ lôgic và nhân với chế độ "số" "số". Điều này cũng có thể được thực hiện với:

matching_a <- as.numeric(dataset %in% x) # Or 

matching_a <- 0 + (dataset %in% x) 

Bạn cũng nên xem xét ?match mà hàm %in% dựa.

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