2016-03-25 10 views
0

Gibt es irgendwelche fehlerfreien und schnelleren Alternativen zu diesem for loop code?Alternative Effizientere Loop-Optionen

for(i in 1:length(Mergedf)) 
{if (Mergedf[i,"z"]==0) 
{Mergedf[i,"cntry_origin"] <-Mergedf[i,"V2"]} 
    print(Mergedf[i,"cntry_origin"]) 
} 

Mergdf wenn das Ergebnis einer komplexen Logik.

Dank

+1

'MergedDf [MergedDf $ z == 0,] cntry_origin $ <- MergedDf [MergedDf $ z == 0,] $ V2' – SymbolixAU

+0

Dank ... aber ist das Datatable? Ich bin nicht vertraut mit der Syntax ... können Sie weiter erklären? – user1916067

+0

Nein, es ist Base R - siehe meine Antwort – SymbolixAU

Antwort

2

Was Sie ist eine sehr grundlegende R ‚Teilmenge und ersetzen‘ Problem zu tun sind versucht. Wenn Sie es gewohnt sind, in einer Sprache wie VBA zu schreiben, dann scheint eine for Schleife dafür natürlich zu sein. Jedoch, wo R "übertrifft" (Wortspiel beabsichtigt) ist die Fähigkeit, diese Art von Operationen zu vektorisieren, so dass es es in einem Schritt macht, ohne den gesamten Datensatz durchlaufen zu müssen.

Der Code hier alle in Base-R geschrieben

Betrachten Sie die Beispieldaten

set.seed(1) 
MergedDF <- data.frame("z" = c(0,1,2,3,0,1,2,3), 
         "cntry_origin" = letters[1:8], 
         "V2" = rnorm(8,0,1), 
         stringsAsFactors = FALSE) 

# z cntry_origin   V2 
# 1 0   a -0.6264538 
# 2 1   b 0.1836433 
# 3 2   c -0.8356286 
# 4 3   d 1.5952808 
# 5 0   e 0.3295078 
# 6 1   f -0.8204684 
# 7 2   g 0.4874291 
# 8 3   h 0.7383247 

für einen bestimmten Zustand eines data.frame Filtern

Um alle Zeilen zu erhalten wo z == 0

MergedDF[MergedDF$z == 0, ] 

# z cntry_origin   V2 
# 1 0   a -0.6264538 
# 5 0   e 0.3295078 

Auswählen bestimmter Spalten

Um alle Werte in Spalte zu erhalten cntry_origin wo z==0 gibt es zwei gleichwertige Aussagen:

MergedDF[MergedDF$z == 0, "cntry_origin"] 
# [1] "a" "e" 

## Or 
MergedDF[MergedDF$z == 0, ]$cntry_origin 
# [1] "a" "e" 

Um den Wert der Spalte V2, wo z==0

MergedDF[MergedDF$z == 0, ]$V2 
#[1] -0.6264538 0.3295078 

Ersetzen eines Co lumn mit unterschiedlichen Werten

Um die Spalte cntry_origin mit V2 zu ersetzen, wo z==0 es ist nur eine Frage von einem zum anderen

MergedDF[MergedDF$z == 0, ]$cntry_origin <- MergedDF[MergedDF$z == 0, ]$V2 

MergedDF

# z  cntry_origin   V2 
# 1 0 -0.626453810742332 -0.6264538 
# 2 1     b 0.1836433 
# 3 2     c -0.8356286 
# 4 3     d 1.5952808 
# 5 0 0.329507771815361 0.3295078 
# 6 1     f -0.8204684 
# 7 2     g 0.4874291 
# 8 3     h 0.7383247 

Die äquivalenten data.table Zuordnung Code wäre

library(data.table) 
setDT(MergedDF)[z==0, cntry_origin := V2] 
+0

Danke für Ihre Antwort. – user1916067

+0

@ user1916067 - wenn dies Ihre Frage beantwortet, sollten Sie das "Häkchen" drücken, um es als abgeschlossen zu markieren – SymbolixAU