【问题标题】:Group data into new column value based of condition根据条件将数据分组为新的列值
【发布时间】:2016-07-07 19:46:48
【问题描述】:

我有如下数据:

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 日期介于 2017 年 2 月 1 日和 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 中的方法。 谢谢

【问题讨论】:

  • 这很简单,但我需要你 dput 数据
  • 能否详细说明?
  • dput(df) 输出 R 对象 df 的纯文本表示。将dput 的输出包含在问题中是一种很好的做法,这样我们就可以轻松获取您的代码并使用它。检查这个:stackoverflow.com/questions/5963269/…?dput

标签: r dataframe


【解决方案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

【讨论】:

  • 也可以使用lubridate的weekisoweek来计算周数:df %&gt;% mutate(Date = lubridate::mdy(Date), Week = lubridate::isoweek(Date), Week = paste('Week', Week - min(Week) + 1))
【解决方案2】:

你可以直接用

拉出一年中的一周
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)))

【讨论】:

    【解决方案3】:

    您可以使用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
    

    不过,您需要提供有关日期如何分布的更多信息,因为周数的计算取决于此。

    【讨论】:

    • 不能根据条件直接拆分日期列本身吗?
    猜你喜欢
    • 2015-11-19
    • 2018-11-30
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2021-05-06
    相关资源
    最近更新 更多