根据条件将数据分组为新的列值

时间:2016-07-07 19:46:48

标签: r dataframe

我有以下数据:

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中建议我一个方法  感谢

3 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用Slubridate

假设您的数据位于名为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

但是,您需要提供有关日期分配方式的更多信息,因为周数的计算取决于此。