2013-01-07 10 views
10

Ho un dataframe simili:aggiungere valori di colonna sulla base di altre colonne cornice dati utilizzando e se

 id  adit  diag1 diag2  
     2  3   4230 2234   
     3  5   3345 4456   
     4  6   4567 4467 

Vorrei aggiungere altre 2 colonne, dse1 e dse2 usando il pseudo-codice qui sotto:

if diag1 contains 4230 then dse1 = 1 else dse1 = 0 

if diag2 contains 4567 then dse2 =1 else dse2 = 0 

ho usato questo:

for (i in 1 : nrow(dse)){ 
    for (j in 3: ncol(dse)){ 
    if dse[i,j] %in% ("4320"){dse$dse1 = 1} 
     else{dse$dse1 = 0} 
    if dse[i,j] %in% ("4567"){dse$dse2 = 1} 
     else{dse$dse2 = 0} 
    } 
} 

ma questi non lavoro.

+0

Tutte le risposte seguenti sono la rotta corretta. Tuttavia, se stai usando 'if/else', allora' else deve essere sulla stessa riga di chiusura '}' dalla tua istruzione 'if'. – Justin

+0

per (i in 1: nrow (DSE)) { for (j in 3: ncol (DSE)) { se (DSE [i, j] == 4230) { DSE $ dse1 = 1 } altro { DSE $ dse1 = 0 } se (DSE [i, j]% in% (4567)) {DSE $ dse2 = 1} else {DSE $ dse2 = 0} } } posso cambiare i codici come sopra, non c'è errore, ma il risultato non è corretto. Perché? THnaks – user1582755

+0

Non so cosa fare del tuo commento. Puoi modificare la tua domanda secondo necessità. Inoltre, se una delle risposte di seguito ha risolto il problema, contrassegnarlo come risposta facendo clic sul segno di spunta verde accanto alla domanda in modo che tutti sappiamo che è stato risolto. – Justin

risposta

18

Non c'è bisogno di utilizzare un ciclo, basta usare ifelse, ad esempio

dse = within(dse, { 
    dse1 = ifelse(diag1 == 4230, 1, 0) 
    dse2 = ifelse(diag2 == 4567, 1, 0) 
}) 
+4

Ho avuto il downvote in arrivo, ho appena aggiunto un codice di esempio. –

+0

Grazie. Il dse1 forse ha molte diagnosi, questo è, se dse [i, j]% in% ("2345", "3456", "5678") {dse1 = 1). E i codici se hanno qualche problema? come correggerli – user1582755

+0

Non sono sicuro di cosa vuoi, per favore aggiungi ulteriori informazioni alla tua domanda. –

10

Non utilizzare il se/else. Go vettorializzare come in:

dat$dse1 <- as.numeric(dat$diag1 == 4230) 
dat$dse2 <- as.numeric(dat$diag2 == 4567) 
+0

+1 bella risposta, se senti comunque che l'uso di 'ifelse' è un po 'più trasparente. Inoltre, puoi avere altri valori di "0" e "1". –

+1

Questa è sicuramente la migliore risposta. 'ifelse (cond, 1, 0)' non dovrebbe mai essere usato. –

4

È possibile utilizzare transform:

transform(dse, dse1 = as.numeric(diag1 == 4230), 
       dse2 = as.numeric(diag2 == 4567)) 
+0

Grazie. Il dse1 forse ha molte diagnosi, questo è, se dse [i, j]% in% ("2345", "3456", "5678") {dse1 = 1). – user1582755

4

Ti piace questa:

dse$dse1<-0 
dse$dse2<-0 
dse$dse1[dse$diag1==4230]<-1 
dse$dse2[dse$diag2==4567]<-1 

Si prega di procurarsi un buon tutorial R (come this) e di leggere tutto sui vettori di indice.

+0

Grazie per tutte le risposte.Se cambiamo le dichiarazioni come queste se diag1 O diag2 contiene 4230 allora dse1 = 1 else dse1 = 0 se diag2 o diag1 contiene 4567 quindi dse2 = 1 else dse2 = 0 e ci sono molti diags in cui ci sono molti codici, quindi sono molti ds Quali sono le risposte pulite – user1582755

Problemi correlati