我有以下数据:
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中的数据分组,即如果hte date位于2/1/2017和2017年2月7日之间,我会添加一个名为“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 :(得分:1)
执行此操作的一种方法是使用S
和lubridate
假设您的数据位于名为dplyr
的数据框中:
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))
答案 1 :(得分: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)))
答案 2 :(得分: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
但是,您需要提供有关日期分配方式的更多信息,因为周数的计算取决于此。