2016-07-07 2 views
0

У меня есть R data.frame, как показано ниже. В магазине я хочу создать столбцы newstart и newend, так что newstart и newend будут вычтены 14 дней из соответствующих столбцов начала и конца.r data.frame возвращается даты

Но если дата нового или нового времени находится либо в исходном столбце начала, либо в конце, я хотел бы вернуться еще на 14 дней.

Таким образом, в случае 3-го ряда, newstart и newend будут установлены в 2013 и 2012 годах и 20131127 соответственно. Но так как 20131120 присутствует в конце столбца для магазина 8 (строка 2), мне нужно вернуться еще на две недели, чтобы получить новую и новую версию. Я должен снова проверить, чтобы убедиться, что newstart и newend отсутствуют в хранилище 8 в начальных и конечных столбцах. Как я мог сделать то же самое?

У меня есть таблица с несколькими значениями для столбца хранилища. Я просто показываю снимок здесь

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

первый ответ ниже работ. Но в случае второй и третьей строки и последних двух строк она предоставляет перекрывающиеся даты. Как я могу избежать такого overalap, удостоверившись, что даты в Newstart и newend DonT пересекаться с начальной и конечной колонной

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** 

ответ

1

Вы можете использовать время цикл в пределах цикла следующего

# 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) 
} 

Обратите внимание, что этот пример не проверяет наличие конфликтов для данного хранилища в столбцах newstart и newend. То есть, у определенного хранилища могут быть совпадающие даты newstart и newend (в отдельных строках). Быстрая модификация, если это нежелательно для вашего приложения.

Update 1

Если вы хотите проверить Newstart и newend столбцы для конфликта, просто добавить эти столбцы в dates_focal, как:

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]] 
) 

Имейте в виду, что такой подход может привести к различным результаты, если порядок строк в вашем фрейме данных maint изменяется, потому что newdates в данной строке зависят от newdates в предыдущих строках.

+0

спасибо за ответ и ваш комментарий. Можно ли ответить на мое обновление 1, которое так же, как вы упомянули ... – user2543622

 Смежные вопросы

  • Нет связанных вопросов^_^