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>