2016-07-07 27 views
0

我有一個像下面的數據:組數據到新的列值基礎條件

Caller Date Duration Status 
304 2/1/2016 756 ANSWERED 
304 2/1/2016 61 ANSWERED 
304 2/4/2016 60 ANSWERED 
304 2/10/2016 61 ANSWERED 
304 2/17/2016 60 ANSWERED 
304 2/19/2016 30 ANSWERED 
304 2/24/2016 27 ANSWERED 
304 2/28/2016 55 ANSWERED 
304 2/28/2016 63 ANSWERED 

我想組R中的數據的基礎上,一週,也就是說,如果興田日期在於2017年2月1日之間2/7/2017我添加了一個名爲「week」的新列,並將值設置爲第1周的元組。類似於本月的其他幾周。

輸出看起來可能像這樣

Caller Date Duration Status Week 
304 2/1/2016 756 ANSWERED Week 1 
304 2/1/2016 61 ANSWERED Week 1 
304 2/4/2016 60 ANSWERED Week 1 
304 2/10/2016 61 ANSWERED Week 2 
304 2/17/2016 60 ANSWERED Week 2 
304 2/19/2016 30 ANSWERED Week 3 
304 2/24/2016 27 ANSWERED Week 4 
304 2/28/2016 55 ANSWERED Week 4 
304 2/28/2016 63 ANSWERED Week 4 

請給我建議的方法在R. 感謝

+0

這是簡單,但我需要你'dput'數據 –

+0

請你解釋一下? –

+1

'dput(df)'輸出R對象'df'的純文本表示。將「dput」的輸出包含在問題中是一種很好的做法,這樣我們就可以輕鬆獲取代碼並使用它。檢查此:http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example和'?dput' – Sumedh

回答

0

可以使用strsplit提取一天,然後計算出一週的日期。

Week <- sapply(df$Date, FUN = function(x){ 
    day <- as.numeric(strsplit(as.character(x),"/")[[1]]2]); 
    return(as.integer(day/7)+1) 
}) 
df$Week <- Week 

雖然,您需要提供更多關於如何分配日期的信息,因爲週數的計算取決於此。要做到這一點

+0

不能直接根據條件拆分日期列? –

1

一種方法是使用lubridatedplyr

假設你的數據在被稱爲dat數據幀:

library(lubridate) 
library(dplyr) 
dat$Date <- mdy(dat$Date) 
t0 <- dat[1, 2] 
dat %>% mutate(Week = paste('Week', as.integer(Date - t0)/7) + 1)) 

結果:

Caller  Date Duration Status Week 
1 304 2016-02-01  756 ANSWERED Week 1 
2 304 2016-02-01  61 ANSWERED Week 1 
3 304 2016-02-04  60 ANSWERED Week 1 
4 304 2016-02-10  61 ANSWERED Week 2 
5 304 2016-02-17  60 ANSWERED Week 3 
6 304 2016-02-19  30 ANSWERED Week 3 
7 304 2016-02-24  27 ANSWERED Week 4 
8 304 2016-02-28  55 ANSWERED Week 4 
9 304 2016-02-28  63 ANSWERED Week 4 
+0

您也可以使用lubridate的'week'或'isoweek'來計算星期:'df%>%mutate(日期= lubridate :: mdy(日期),星期= lubridate :: isoweek(日期)周',周 - 分(周)+ 1))' – alistaire

1

你可以拉直接與當年的一週

format(as.Date("2016-07-01"), format = "Week %U") 

有關格式設置的更多詳細信息,請參閱strptime的幫助。請注意,例如,它只給出一年中的一週 - 因此2017-01-01將在2016年之前進行。您可以編寫類似於@ ManishGoel答案的包裝,將您的起點設置爲第1周。

一個更通用的解決方案是使用cut

mycuts <- seq(as.Date("2016-01-01"), as.Date("2017-12-30"), 7) 
cut(as.Date("2016-07-01"), mycuts, labels = 1:(length(mycuts)-1)) 

這可能是更容易擴展您的需求,並更廣泛地適用於其他類的問題。如果你真的需要「周」,在那裏,你可以做到這一點也直接:

cut(as.Date("2016-07-01"), mycuts, labels = paste("Week", 1:(length(mycuts)-1)))