2016-07-07 55 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))) 
相关问题