2011-04-13 19 views
6

मैं एक समारोह है कि इस प्रकार कार्य करता लिखने के लिए कोशिश कर रहा हूँ में एक डेटा फ्रेम विभाजित है, लेकिन यह बहुत मुश्किल साबित हो रहा है:ओवरलैपिंग dataframes

DF <- data.frame(x = seq(1,10), y = rep(c('a','b','c','d','e'),2)) 
> DF 
    x y 
1 1 a 
2 2 b 
3 3 c 
4 4 d 
5 5 e 
6 6 a 
7 7 b 
8 8 c 
9 9 d 
10 10 e 

>OverLapSplit(DF,nsplits=2,overlap=2) 
[[1]] 
    x y 
1 1 a 
2 2 b 
3 3 c 
4 4 d 
5 5 e 
6 6 a 

[[2]] 
    x y 
1 5 a 
2 6 b 
3 7 c 
4 8 d 
5 9 e 
6 10 a 

>OverLapSplit(DF,nsplits=1) 
[[1]] 
    x y 
1 1 a 
2 2 b 
3 3 c 
4 4 d 
5 5 e 
6 6 a 
7 7 b 
8 8 c 
9 9 d 
10 10 e 

>OverLapSplit(DF,nsplits=2,overlap=4) 
[[1]] 
    x y 
1 1 a 
2 2 b 
3 3 c 
4 4 d 
5 5 e 
6 6 a 
7 7 b 

[[2]] 
    x y 
1 4 e 
2 5 a 
3 6 b 
4 7 c 
5 8 d 
6 9 e 
7 10 a 

>OverLapSplit(DF,nsplits=5,overlap=1) 
[[1]] 
    x y 
1 1 a 
2 2 b 
3 3 c 

[[2]] 
    x y 
1 3 c 
2 4 d 
3 5 e 

[[3]] 
    x y 
1 5 e 
2 6 a 
3 7 b 

[[4]] 
    x y 
1 7 b 
2 8 c 
3 9 d 

[[5]] 
    x y 
1 8 d 
2 9 e 
3 10 f 

मैं क्या करता है, तो आप क्या होगा के बारे में बहुत नहीं सोचा जैसे OverLapSplit(DF,nsplits=2,overlap=1)

की कोशिश की कुछ हो सकता है कि निम्नलिखित:

[[1]] 
    x y 
1 1 a 
2 2 b 
3 3 c 
4 4 d 
5 5 e 

[[2]] 
    x y 
1 5 a 
2 6 b 
3 7 c 
4 8 d 
5 9 e 
6 10 a 

धन्यवाद!

+0

तो क्या यह कार्य मौजूद है, या आप नहीं जानते कि किनारे के मामलों को कैसे संभाला जाए? – Chase

+0

@ फ़ंक्शन का कार्य मौजूद नहीं है। अगर मुझे एक व्यावहारिक (हालांकि सुरुचिपूर्ण) संस्करण कोडित किया गया है, तो मैं इसे पोस्ट करूंगा। – Zach

+0

@Zach यह क्यू _apropos_ आपके पहले क्यू है? http://stackoverflow.com/q/5652058/429846 –

उत्तर

6

की तरह कुछ का प्रयास करें:

OverlapSplit <- function(x,nsplit=1,overlap=2){ 
    nrows <- NROW(x) 
    nperdf <- ceiling((nrows + overlap*nsplit)/(nsplit+1)) 
    start <- seq(1, nsplit*(nperdf-overlap)+1, by= nperdf-overlap) 

    if(start[nsplit+1] + nperdf != nrows) 
     warning("Returning an incomplete dataframe.") 

    lapply(start, function(i) x[c(i:(i+nperdf-1)),]) 
} 

nsplit साथ विभाजन की संख्या! (nsplit = 1 2 डेटा फ्रेम लौटाता है)। यदि ओवरलैप विभाजन वास्तव में डेटाफ्रेम में फिट नहीं होते हैं, और चेतावनी जारी करते हैं, तो यह एक अपूर्ण अंतिम डेटा फ्रेम प्रस्तुत करेगा।

> OverlapSplit(DF,nsplit=3,overlap=2) 
[[1]] 
    x y 
1 1 a 
2 2 b 
3 3 c 
4 4 d 

[[2]] 
    x y 
3 3 c 
4 4 d 
5 5 e 
6 6 a 

[[3]] 
    x y 
5 5 e 
6 6 a 
7 7 b 
8 8 c 

[[4]] 
    x y 
7 7 b 
8 8 c 
9 9 d 
10 10 e 

और एक चेतावनी के साथ एक

> OverlapSplit(DF,nsplit=1,overlap=1) 
[[1]] 
    x y 
1 1 a 
2 2 b 
3 3 c 
4 4 d 
5 5 e 
6 6 a 

[[2]] 
    x y 
6 6 a 
7 7 b 
8 8 c 
9 9 d 
10 10 e 
NA NA <NA> 

Warning message: 
In OverlapSplit(DF, nsplit = 1, overlap = 1) : 
    Returning an incomplete dataframe. 
+0

+1 पहले सिद्धांतों से अच्छा जवाब --- मैं भी [आलसी | बेवकूफ] * पहले प्रिंसिपल के लिए। [* लागू होने के रूप में हटाएं] ;-) –

+0

@ गेविन सिम्पसन: मैंने अपने स्वयं के उत्तर को पूरे वर्कफ़्लो के साथ पोस्ट किया है जो मुझे दिमाग में है। निश्चित रूप से सुधार के लिए जगह है, लेकिन मुझे लगता है कि यह अब मेरी ज़रूरतों को पूरा करेगा। सभी सुझावों के लिए धन्यवाद! – Zach

+0

@ जोरीस मेयस आप "अधूरा" ओवरलैपिंग डेटाफ्रेम (यानी, केवल एक चेतावनी से पहले एक कदम आगे बढ़ने) के बारे में नहीं जाएंगे –

4

यह जाली ग्राफिक्स से तख़्ती विचार का उपयोग करता है और इसलिए पैकेज lattice अंतराल उत्पन्न करने के लिए से कोड का लाभ उठाता है और फिर एक पाश में मूल DF तोड़ने के लिए उपयोग करता है सही सबसेट्स।

मुझे बिल्कुल यकीन नहीं था कि overlap = 1 द्वारा क्या मतलब है - मुझे लगता है कि आपका मतलब 1 नमूना/अवलोकन द्वारा ओवरलैप करना था। यदि हां, तो नीचे दिया गया कोड यह करता है।

OverlapSplit <- function(x, nsplits = 1, overlap = 0) { 
    stopifnot(require(lattice)) 
    N <- seq_len(nr <- nrow(x)) 
    interv <- co.intervals(N, nsplits, overlap/nr) 
    out <- vector(mode = "list", length = nrow(interv)) 
    for(i in seq_along(out)) { 
     out[[i]] <- x[interv[i,1] < N & N < interv[i,2], , drop = FALSE] 
    } 
    out 
} 

देता है कौन सा:

> OverlapSplit(DF, 2, 2) 
[[1]] 
    x y 
1 1 a 
2 2 b 
3 3 c 
4 4 d 
5 5 e 
6 6 a 

[[2]] 
    x y 
5 5 e 
6 6 a 
7 7 b 
8 8 c 
9 9 d 
10 10 e 

> OverlapSplit(DF) 
[[1]] 
    x y 
1 1 a 
2 2 b 
3 3 c 
4 4 d 
5 5 e 
6 6 a 
7 7 b 
8 8 c 
9 9 d 
10 10 e 

> OverlapSplit(DF, 4, 1) 
[[1]] 
    x y 
1 1 a 
2 2 b 
3 3 c 

[[2]] 
    x y 
3 3 c 
4 4 d 
5 5 e 

[[3]] 
    x y 
6 6 a 
7 7 b 
8 8 c 

[[4]] 
    x y 
8 8 c 
9 9 d 
10 10 e 
+0

बस 'ओवरलैप' की परिभाषा से सावधान रहें; 'co.intervals() 'ओवरलैप का ओवरलैप ओवरलैपिंग नमूने की पूर्ण संख्या नहीं चाहता है, इसलिए कुछ स्थितियों में एक गोल-बंद समस्या हो सकती है। यदि ऐसा होता है और आप –

+0

+1 woo-yeah की तुलना में एक कम/अधिक ओवरलैप प्राप्त करते हैं! कभी मेरे लिए ऐसा करने के लिए हैकिंग जाली के बारे में सोचा नहीं। अच्छा है –

0

बस मैं यहाँ कर रहा हूँ यह स्पष्ट क्या बनाने के लिए:

#Load Libraries 
library(PerformanceAnalytics) 
library(quantmod) 

#Function to Split Data Frame 
OverlapSplit <- function(x,nsplit=1,overlap=0){ 
    nrows <- NROW(x) 
    nperdf <- ceiling((nrows + overlap*nsplit)/(nsplit+1)) 
    start <- seq(1, nsplit*(nperdf-overlap)+1, by= nperdf-overlap) 

    if(start[nsplit+1] + nperdf != nrows) 
     warning("Returning an incomplete dataframe.") 

    lapply(start, function(i) x[c(i:(i+nperdf-1)),]) 
} 

#Function to run regression on 30 days to predict the next day 
FL <- as.formula(Next(HAM1)~HAM1+HAM2+HAM3+HAM4) 
MyRegression <- function(df,FL) { 
    df <- as.data.frame(df) 
    model <- lm(FL,data=df[1:30,]) 
    predict(model,newdata=df[31,]) 
} 

#Function to roll the regression 
RollMyRegression <- function(data,ModelFUN,FL) { 
    rollapply(data, width=31,FUN=ModelFUN,FL, 
    by.column = FALSE, align = "right", na.pad = FALSE) 
} 

#Load Data 
data(managers) 

#Split Dataset 
split.data <- OverlapSplit(managers,2,30) 
sapply(split.data,dim) 

#Run rolling regression on each split 
output <- lapply(split.data,RollMyRegression,MyRegression,FL) 
output 
unlist(output) 

इस तरीके में, आप एक समानांतर साथ अंत में lapply जगह ले सकता है लापरवाही का संस्करण और कुछ हद तक अपनी गति बढ़ाएं।

बेशक, अब प्रोसेसर की संख्या और आपके डेटासेट के आकार के बाद, विभाजन/ओवरलैप को अनुकूलित करने का मुद्दा है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^