2016-04-24 7 views
0

Angenommen, ich habe einen Datensatz mit 2 Variablen, a und b, wobei alle b's a sind, aber nicht alle a's sind b's.Neue Variable mit for-Schleife und if-Anweisungen in R

a<-rbind(1,1,1,1,1) 
b<-rbind(0,0,0,1,1) 
d<-cbind(a,b) 
d 
     [,1] [,2] 
[1,] 1 0 
[2,] 1 0 
[3,] 1 0 
[4,] 1 1 
[5,] 1 1 

Ich möchte eine neue dritte Variable erstellen, um diese Informationen in einem einzigen Datenrahmen zu verdichten. Ich habe versucht, so zu tun, indem eine Schleife 1 in nrows schreiben, wenn die eine Variable 1 dann eine 2 schreiben, und wenn die b Variable 1 ist dann ein 1

e<- for (i in 1:nrow(d)) { 
    if (d[,1]==1) { 
     e$new[,i] <- 2 
    } # end if 1 
    else (d[,2]==1) 
    e$new[,i]<-1 
     } # end for 2 

} # end for 

schreiben möchte ich im Grunde die Ausgabe aussehen als solche:

> d 
     [,1] [,2] [,3] 
[1,] 1 0 2 
[2,] 1 0 2 
[3,] 1 0 2 
[4,] 1 1 1 
[5,] 1 1 1 

ich erhalte eine Fehlermeldung: Fehler bei e $ new [i] <-0: falsche Anzahl der Indizes auf Matrix Zusätzlich: Warnmeldungen: 1: in 1: x: numerischer Ausdruck hat 2 Elemente: nur das zuerst verwendete 2: In wenn (d [, 1] == 1) {: die Bedingung ha s length> 1 und nur das erste Element wird verwendet

Jede Hilfe zum Debuggen des Skripts wäre willkommen!

+0

Es gibt zwei Probleme so weit in Ihrem Code zu verwenden, wie ich sehen kann. Erstens können Sie keine Variable verwenden, ohne sie zu definieren, hier die Variable "e". Zweitens ist e $ new bereits eine Liste/ein Vektor, auf dessen Element Sie nicht zugreifen sollten durch '[, i]', '[i]' sollte ausreichen. – Psidom

+0

'c (2,1) [d [, 1] + d [, 2]]' funktioniert auch mit ein wenig kreativer Indizierung. – thelatemail

+0

Danke für die Hilfe! Also, @Psidom Ich muss nur das "e" -Objekt mit "e <- NULL" initialisieren? –

Antwort

1

um die Dinge einfacher zu machen, konvertiert ich Ihre Matrix in einem Datenrahmen

a<-rbind(1,1,1,1,1) 
b<-rbind(0,0,0,1,1) 
d<-as.data.frame(cbind(a,b)) 

Dies einige Operationen einfacher (wenn nötig macht, können Sie immer as.matrix (data_frame) verwenden können, es wieder in eine Matrix zu konvertieren)

ist die for-Schleife, die ich mit

for(i in 1:nrow(d)){ 
    if((d[i,1] == 1 & d[i,2] == 0) == TRUE){ 
     d$V3[i] <- 2 
    }else if((d[i,2] == 1) == TRUE){ 
     d$V3[i] <- 1 
    } 
} 

kam, was ich glaube, dass es passiert ist, dass Sie die Bedingung testen wollen, dass ein Element gleich Eins, aber Ihre Operation gibt einen Vektor zurück. Deshalb änderte ich die Bedingung leicht, indem ich eine Zeile und einen Spaltenindex hinzufügte und es boolesch machte.

Eine weitere Möglichkeit, das Ergebnis Sie erwarten, zu erreichen, ist ein ifelse Befehl in der folgenden Art und Weise

##This is just to recreate the data frame 
remove(list = ls()) 
a<-rbind(1,1,1,1,1) 
b<-rbind(0,0,0,1,1) 
d<-as.data.frame(cbind(a,b)) 
d$V3 <- ifelse(d$V1 == 1 & d$V2 == 0, 2,1) 
+1

Vereinbaren Sie die Verwendung von ifelse von @ Harro-Cyranka, und wenn das OP eine Situation haben sollte, in der a == 0, könnten Sie verschachtelte ifelse-Anweisungen verwenden: 'd $ V3 <- ifelse (d $ V1 = = 1 & d $ V2 == 0, 2, ifelse (d $ V1 == 0, 0, 1)) ' – user5042861

+1

Danke für die Hilfe @ Harro-Cyranka und @ user5042861! Herzlichen Dank! –

Verwandte Themen