2013-07-01 12 views
7

Supponiamo che io ho una data.frame come segue:Impostare il flag se un valori della colonna sono corrispondenti con quelli di un altro vettore

a <- data.frame(id=c(1,3,4,5,7,8,9,6,54,3,5,6,87,6)) 

E ho un vettore temp come segue:

temp<-c(1,3,5,9) 

Ora , Voglio creare una nuova colonna flag sul mio data.frame, dove dovrebbe essere 1 dove id è in temp e 0 altrove. Questo è quello che ho provato:

a$flag <- ifelse(a$id==temp, 1, 0) 

e output desiderato dovrebbe essere (1,1,0,1,0,0,1,0,0,1,1,0,0,0).

Ma dal mio codice sopra, flag non viene aggiornato correttamente. Cosa mi manca qui? Posso/devo usare %in%? Se é cosi, come?

Grazie per tutto l'aiuto

+2

+1, benvenuto in SO. Tuttavia, questa sembra essere una domanda piuttosto semplice. Ti suggerisco di cercare SO prima di postare. – Arun

+0

'ifelse' non ha funzionato a causa del riciclaggio a causa delle diverse lunghezze dei vettori. –

risposta

4

Penso che questo è quello che stai cercando. Ci sono un paio di problemi nel modo in cui si sta facendo il vostro data.frame:

a <- data.frame(id = c(1,3,4,5,7,8,9,6,54,3,5,6,87,6), 
       flag = 0) 

Poi, per aggiornare i valori di flag a 1 dove id è in temp, è possibile indicizzare i valori utilizzando [ e il test logico %in%, e assegnare loro 1

a$flag[a$id %in% temp] <- 1 

a 
# id flag 
# 1 1 1 
# 2 3 1 
# 3 4 0 
# 4 5 1 
# 5 7 0 
# 6 8 0 
# 7 9 1 
# 8 6 0 
# 9 54 0 
# 10 3 1 
# 11 5 1 
# 12 6 0 
# 13 87 0 
# 14 6 0 
+0

Perfecto! Non so perché ifelse non ha funzionato comunque. Molte grazie !! –

+1

@carlwhyte, prova a eseguire 'a $ id == temp' e prova a capire cosa è successo (incluso il messaggio di avviso). Suggerimento: poiché 'temp' non ha la stessa lunghezza di' a $ id', viene * riciclato *. – Arun

+0

vedo, grazie Arun! –

1
a$flag <- 0 + (a$id %in% temp) 

l'unica ragione per cui ifelse fallito, è stato l'uso di "==" quando il test logico avrebbe dovuto essere %in%.

a<- data.frame(id=c(1,3,4,5,7,8,9,6,54,3,5,6,87,6)) 
temp<-c(1,3,5,9) 

a$flag <- ifelse(a$id %in% temp, 1, 0) 

> a 
    id flag 
1 1 1 
2 3 1 
3 4 0 
4 5 1 
5 7 0 
6 8 0 
7 9 1 
8 6 0 
9 54 0 
10 3 1 
11 5 1 
12 6 0 
13 87 0 
14 6 0 

preferisco dimostrando non ifelse soluzioni perché trovo che costrutto generalizza poco a situazioni complesse modalità.

+0

perché una conversione implicita? La gente ha suggerito 'as.numeric'. – flodel

+0

Critiche valide. Il codice sottostante l'operazione "+" farà la coercizione. È un numero inferiore di tasti, ma probabilmente non più veloce, poiché sarà creato un vettore aggiuntivo e il calcolo. Penso che potrebbe essere utile capire le conversioni di tipo implicito R. –

Problemi correlati