2017-05-19 4 views
0

Ich habe 4 Artikel. Jeder Artikel hat eine zufällige Anzahl von Orten mit Daten an jedem Ort. Der Code, den ich jetzt habe, durchläuft die Orte und erzeugt einen Datenrahmen von Ortsdaten. Ich möchte dann diese Positionsdaten übernehmen, sie in einen Datenrahmen für das entsprechende Element einfügen und dann zum nächsten Ort dieses Elements wechseln, der zum Positionsdatenrahmen usw. hinzugefügt wird, bis alle Orte dafür vorliegen Element wurde zum Datenrahmen hinzugefügt. Ich möchte, dass es dann zum nächsten Element geht und den Vorgang für einen separat benannten Datenrahmen wiederholt. Zum Beispiel sollte der Datenrahmen für Punkt 1 den Namen item1 haben, der Datenrahmen für den Punkt 2 sollte den Namen item2 haben usw. Ich habe versucht, die Funktionen assign und paste0 dafür zu verwenden, aber paste0 erzeugt einen String und die assign-Funktion erkennt ihn nicht dass ich die Daten dem Datenrahmen und nicht der Zeichenfolge zuweisen möchte. Beispielcode ist unten aufgeführt und jede Hilfe, die zur Verfügung gestellt werden kann, wird sehr geschätzt!Zuweisung mit for-Schleifen

for (p in 1:4) # 1-4 because there are 4 items 
    { 
    #Initialize the item data frame 
    assign(paste0("item",p),data.frame(item_no=character(), x=integer(), y=integer(), data_val=integer())) 

     #Loop through all locations for this item ID 
     num_locations = sample(1:9,1) #Number of locations 
     for (i in 1:(num_locations)){ #Loop through each location 

     #Access data for current location (pulls from a database in actual code) 

     ################################################## 
     item_no <- p 
     x <- sample(-3:3,1) 
     y <- sample(-3:3,1) 
     data_val <- sample(0:100,1) 
     ################################################## 

     #################DATA FRAME###################### 
     assign(paste0("location_data",i),data.frame(item_no, x, y, data_val)) 
     assign(paste0("item",p), data.frame(rbind(paste0("item", p), paste0("location_data", p)))) 


     #paste0 creates a string and therefore is not recognized that I want to call the data within itemp or location_datap 
     #rbind needed because the loop through impact locations for a single item requries initialization of an empty data frame 
     #for the first time through the location loop, the empty itemp data frame is overwritten by the location_datap data frame and supplemented each location thereafter 


     ################################################ 
     } 

    } 
+3

Ihre Frage ist nicht sehr klar und es gibt einfachere Möglichkeiten, um Ihr Problem zu lösen. Die Verwendung der Assign-Anweisung wird im Allgemeinen nicht empfohlen. Ich würde vorschlagen, eine Liste von Datenrahmen (siehe Antwort unten) oder einen großen Datenrahmen mit einer zusätzlichen Spalte für Ihre Artikelnummer. Es hängt alles von Ihren zukünftigen Analyseanforderungen ab. – Dave2e

Antwort

0

Ich denke, es ist eine gute Idee, Listen anstelle von assign Funktion zu verwenden. Zum Beispiel:

items <- list() 
for (p in 1:4) { 
    items[[p]] <- data.frame(...) 
    ... 
    items[[p]] <- rbind(items[[p]], ...) 
} 

Auch dieser Tipp kann für die zweite Schleife verwendet werden.