2016-07-07 33 views
0

Ich habe ein R data.frame wie folgt. Nach dem Speichern möchte ich neue Anfangs- und Endspalten erstellen, so dass newstart und newend 14 Tage von den entsprechenden Start- und Endspalten abgezogen werden.r data.frame geht zurück Daten

Aber wenn der Newstart oder das neue Datum entweder in der ursprünglichen Anfangs- oder Endspalte ist, würde ich gerne 14 Tage weiter gehen.

Also in der dritten Zeile, newstart und newend werden 20131120 und 20131127 sein. Aber da 20131120 in der Endspalte für Geschäft 8 (Reihe 2) vorhanden ist, muss ich noch 2 Wochen zurückgehen, um Neu- und Neubeginn zu bekommen. Ich muss es noch einmal überprüfen, um sicherzustellen, dass newstart und newend nicht für Filiale 8 in den Start- und Endspalten vorhanden sind. Wie könnte ich das Gleiche tun?

Ich habe eine Tabelle mit mehreren Werten für Geschäftsspalte. Ich zeige nur einen Schnappschuss hier

store=c(rep(8,4),rep(11,4)) 
start=c("20131009","20131113","20131204","20150624","20140820","20140924","20150923","20151014") 
end=c("20131016","20131120","20131211","20150701","20140827","20141001","20150930","20151021") 

maint=data.frame(store,start,end) 



maint$start=as.Date(maint$start,"%Y%m%d") 
maint$end=as.Date(maint$end,"%Y%m%d") 
maint 
    store start  end 
1  8 20131009 20131016 
2  8 20131113 20131120 
3  8 20131204 20131211 
4  8 20150624 20150701 
5 11 20140820 20140827 
6 11 20140924 20141001 
7 11 20150923 20150930 
8 11 20151014 20151021 

---------------------- update1

die erste Antwort unten funktioniert. Aber im Falle der zweiten und dritten Zeile und der letzten zwei Zeilen bietet es überlappende Daten. Wie kann ich solche overalap vermeiden gleichzeitig dafür, dass Termine in newstart und newend mit Start- und End-Spalte

store start end newstart newend 

8 10/9/2013 10/16/2013 9/25/2013 10/2/2013 
**8 11/13/2013 11/20/2013 10/30/2013 11/6/2013 
8 12/4/2013 12/11/2013 10/23/2013 10/30/2013** 
8 6/24/2015 7/1/2015 6/10/2015 6/17/2015 
11 8/20/2014 8/27/2014 8/6/2014 8/13/2014 
11 9/24/2014 10/1/2014 9/10/2014 9/17/2014 
**11 9/23/2015 9/30/2015 9/9/2015 9/16/2015 
11 10/14/2015 10/21/2015 9/2/2015 9/9/2015** 

Antwort

1

überlappen müssen Sie nicht eine while-Schleife innerhalb einer for-Schleife verwenden könnte als

Hinweis
# create newdate columns 
maint$newstart <- as.Date(NA) 
maint$newend <- as.Date(NA) 

# loop over each row of maint 
for(i in 1:nrow(maint)) { 

    # get all start and end dates for current store 
    dates_focal <- c(maint$start[maint$store == maint$store[i]], 
        maint$end[maint$store == maint$store[i]]) 

    # subtract 14 days from newstart and newend 
    newstart <- maint$start[i] - 14 
    newend <- maint$end[i] - 14 

    # exit condition for following while loop 
    exit_condition <- F 

    # check for conflict 
    # if conflict, repeatedly subtract 14 days until no more conflict 
    while(!exit_condition) { 

    conflict <- any(is.element(c(newstart, newend), dates_focal)) 

    if (conflict) { 
     newstart <- newstart - 14 
     newend <- newend - 14 
    } else { 
     exit_condition <- T 
    } 
    } 

    # set newstart and newend 
    maint$newstart[i] <- as.Date(newstart) 
    maint$newend[i] <- as.Date(newend) 
} 

folgt, dass In diesem Beispiel wird nicht nach Konflikten für einen bestimmten Speicher in den newstart- und newend-Spalten gesucht. Das heißt, ein gegebenes Geschäft könnte überlappende Newstart- und Newend-Daten haben (in separaten Zeilen). Sollte eine schnelle Änderung sein, wenn das für Ihre Anwendung unerwünscht ist.

Update 1

Wenn Sie auch die newstart und newend Spalten für Konflikte überprüfen möchten, fügen Sie einfach diese Spalten zu dates_focal, wie in:

dates_focal <- c(
    maint$start[maint$store == maint$store[i]], 
    maint$end[maint$store == maint$store[i]], 
    maint$newstart[maint$store == maint$store[i]], 
    maint$newend[maint$store == maint$store[i]] 
) 

Beachten Sie, dass dieser Ansatz anders ergeben können Ergebnisse, wenn die Reihenfolge der Zeilen in Ihrem Maint-Datenrahmen geändert wird, da Newdates innerhalb einer bestimmten Zeile von Newdates in vorherigen Zeilen abhängen.

+0

danke für die Antwort und Ihren Kommentar. Wäre es möglich, mein Update 1 zu beantworten, das dasselbe wie das ist, was Sie erwähnt haben ... – user2543622