2016-05-13 13 views
1

Ich habe eine XDF-Datei namens Probe03Seq, die eine Liste von Ereignissen hat.Erstellen eines Arrays von verzögerten Werten mit rxDataStep und mclapply

Variable information: 
Var 1: cm_mac_address  55718 factor levels: 
Var 2: time, Type: POSIXct 
Var 3: status  3 factor levels: 
Var 4: duration_disc  10 factor levels: 
Var 5: down_power_disc  10 factor levels: 
Var 6: down_snr_disc  10 factor levels: 
Var 7: down_speed_disc  10 factor levels 
Var 8: latency_disc  1 factor levels: 
Var 9: up_power_disc  10 factor levels: 
Var 10: up_speed_disc  10 factor levels: 
Var 11: Sequence  34777 factor levels: 

ich teilten dann diese große xdf durch die Spalte cm_mac_address in viele kleine xdf ist und sie von Zeit sortieren.

nocSplit <- rxSplit(inData = "probe03Seq.xdf", 
       outFilesBase = file.path(tempdir(), "MACAddress"), 
       splitByFactor = "cm_mac_address") 

mclapply(nocSplit, FUN = function(xdf) { 

rxSort(inData = xdf, 
     outFile = xdf, 
     sortByVars = "time", 
     overwrite = TRUE) 
}) 

Ich versuche jetzt herauszufinden, wie man eine neue Variable über diese kleinen xdfs erstellen. Ich möchte in der Spalte Sequenz eine Fenstergröße festlegen und ein Array der vorherigen Werte erstellen können. Wenn ich zum Beispiel jede Stunde eine Beobachtung mit einer Fenstergröße von 10 Stunden habe, würde ich gerne etwas wie die Spalte SequenceList sehen.

window.size = 10 hrs 

time Sequence SequenceList 
1  6  NA 
2  5  NA 
3  7  NA 
4  8  NA 
5  4  NA 
6  2  NA 
7  10  NA 
8  9  NA 
9  4  NA 
10  6  {6,5,7,8,4,2,10,9,4,6} 
11  4  {5,7,8,4,2,10,9,4,6,4} 
12  3  {7,8,4,2,10,9,4,6,4,3} 
13  8  {8,4,2,10,9,4,6,4,3,8} 
14  3  {4,2,10,9,4,6,4,3,8,3} 
15  9  {2,10,9,4,6,4,3,8,3,9} 
16  1  {10,9,4,6,4,3,8,3,9,1} 
17  7  {9,4,6,4,3,8,3,9,1,7} 
18  3  {4,6,4,3,8,3,9,1,7,3} 
19  8  {6,4,3,8,3,9,1,7,3,8} 
20  10  {4,3,8,3,9,1,7,3,8,10} 

Matt Parker aus dem Azure-Team hatte einen guten Code 1 Zeile unten hinken. https://gist.github.com/mmparker/8aca803eae5410875a21

lagVar <- function(dataList) { 

if(.rxStartRow == 1) { 
    dataList[[newName]] <- c(NA, dataList[[varToLag]][-.rxNumRows]) 
} else { 
    dataList[[newName]] <- c(.rxGet("lastValue"), 
          dataList[[varToLag]][-.rxNumRows]) 
    } 

.rxSet("lastValue", dataList[[varToLag]][.rxNumRows]) 

dataList 

} 


lapply(djiaSplit, FUN = function(xdf) { 

rxDataStep(inData = xdf, 
      outFile = xdf, 
      transformObjects = list(
       varToLag = "Open", 
       newName = "previousOpen"), 
      transformFunc = lagVar, 
      # append = "cols", 
      overwrite = TRUE) 

}) 

Ich denke, der gleiche Ansatz rxDataStep mit einer benutzerdefinierten Funktion in mclapply der Verpackung kann wieder verwendet werden. Ich habe nur Schwierigkeiten mit dieser Funktion. Jede Hilfe wäre willkommen! Zur Zeit habe ich diesen Code

Ich habe eine Funktion herausgefunden, dass mit einem normalen Datenrahmen arbeitet,

set.seed(100) 
mydf<-data.frame(time=(1:1000),event = sample(1:10,10000,replace=TRUE)) 

w=10 
for (i in 1:nrow(mydf)){ 
    if(i<=w){ 
    mydf$eventList[i] = NA 
    } 
else { 
     mydf$eventList[i] = list(mydf$event[c((i-w):i)]) 
     } 
} 

Allerdings, wenn ich das ändere mit einer xdf Datei zu arbeiten, ich einen Fehler.

lagVarWindow <- function(dataList) { 

for (i in 1:.rxNumRows){ 
if(i<=window.size){ 
dataList[[newName]][i] = NA 
} 
else { 
dataList[[newName]][i] = list(dataList[[varToLag]][c((i-window.size):i)]) 
} 
} 

dataList 

} 


mclapply(nocSplit, FUN = function(xdf) { 

rxDataStep(inData = xdf, 
      outFile = xdf, 
transformObjects = list(
window.size = 10, 
       varToLag = "Sequence", 
       newName = "Sequence2"), 
      transformFunc = lagVarWindow, 
# append = "cols", 
      overwrite = TRUE) 

}) 

Error in doTryCatch(return(expr), name, parentenv, handler) : 
Found list tag in the middle of data: '<list=Sequence2&2190:1> 

Antwort

0

konnte ich den Fehler beheben, indem es in der Paste() Funktion

Einwickeln
lagVarWindow <- function(dataList) { 

for (i in 1:.rxNumRows){ 
    if(i<=window.size){ 
        dataList[[newName]][i] = NA 
        } 
    else { 
     dataList[[newName]][i] = paste(list(dataList[[varToLag]][c((i-window.size):i)])) 
     } 
} 

dataList 

}