2011-11-05 16 views
6

Vorrei creare un cosiddetto vettore di corrispondenza costituito da binari. Tutti i numeri dovrebbero essere zero a meno che gli elementi appartengano alla stessa variabile.Come creare un vettore binario con 1 se gli elementi fanno parte dello stesso vettore?

Ecco un esempio:

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

Così, ho un set di dati con tutte le variabili nella prima riga. Ora creo due gruppi: var1 e var2.

Il vettore di corrispondenza per l'elemento "a" si suppone a guardare come:

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

I numeri corrispondono al mio set di dati. Se le variabili nel mio set di dati sono nello stesso gruppo, dovrebbe esserci un 1 nel mio vettore di corrispondenza e uno 0 altrimenti.

Tuttavia, il mio set di dati effettivo è troppo grande per farlo manualmente. Qualcuno capisce cosa voglio fare?

risposta

4

Utilizzo della funzione ifelse e %in%.

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 

Inoltre, se si hanno molte più partite per rendere più var1 e var2, sarà utile estendere questo a qualcosa di simile:

> 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

vedo che John Colby ha ho già preso la strada che stavo per suggerire, ma ho pensato che avrei reso più esplicito.

La funzione diadica %in% restituisce un vettore logico e moltiplica per 1 convertito in modalità "numerica" ​​. Questo potrebbe anche essere fatto con:

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

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

Si dovrebbe anche guardare ?match su cui si basa la funzione %in%.

Problemi correlati