2017-03-11 7 views
-2

Ich habe einen Datenrahmen, der Faktoren mit durch Komma getrennten Werten enthält. Ich entschuldige mich für nicht ein reproduzierbares Beispiel liefert, aber meine Daten endet wie folgt aussehen:Eine effizientere Möglichkeit zur Berechnung einer booleschen Spalte

Col_1 Col_2 Col_3 

1  0  0 
0  0  1 
2  0  0 
1  2,2  2 
3  0  1,2 

Weil ich durch Kommata getrennte Werte, ich habe nicht in der Lage gewesen, eine schnelle klammert Notation Ansatz zu schreiben, dass R fantastisch bei. So habe ich hatte eine for-Schleife eine Schleife durch meine Datenrahmen zu schreiben und alle Nicht-Null-Einträge in eine

for(i in seq(1:nrow(DF))){ 
    if(DF$Col_2 ==0){ 
    DF$NewCol[i] == 0} 
    else { 
    DF$NewCol[i] == 1} 

Die oben genannten Arbeiten 1. ändern, aber dauert viel zu lange. Gibt es eine Möglichkeit, dies mit einem anderen Ansatz in R zu beschleunigen?

+1

Erstens, warum haben Sie den seq()? Zweitens, warum macht das Komma-Problem einen Unterschied, warum nicht "ifelse" oder sogar Klammern verwenden? – Elin

Antwort

3

Try this:

DF <- read.table(text="Col_1 Col_2 Col_3 
1  0  0 
0  0  1 
2  0  0 
1  2,2  2 
3  0  1,2", header=TRUE, stringsAsFactors=FALSE) 

DF$NewCol <-ifelse(DF$Col_2 ==0,0,1) 
> DF 
    Col_1 Col_2 Col_3 NewCol 
1  1  0  0  0 
2  0  0  1  0 
3  2  0  0  0 
4  1 2,2  2  1 
5  3  0 1,2  0 
2

Wie wäre es einfach

DF$NewCol <- as.integer(DF$Col_2 != "0") 

die gibt

Col_1 Col_2 Col_3 NewCol 
1  1  0  0  0 
2  0  0  1  0 
3  2  0  0  0 
4  1 2,2  2  1 
5  3  0 1,2  0 

und ist viel effizienter als ifelse() mit einem binären Ergebnis zu erzeugen.

Daten:

DF <- structure(list(Col_1 = c(1L, 0L, 2L, 1L, 3L), Col_2 = structure(c(1L, 
1L, 1L, 2L, 1L), .Label = c("0", "2,2"), class = "factor"), Col_3 = structure(c(1L, 
2L, 1L, 4L, 3L), .Label = c("0", "1", "1,2", "2"), class = "factor")), .Names = c("Col_1", 
"Col_2", "Col_3"), row.names = c(NA, -5L), class = "data.frame") 
Verwandte Themen