簡體   English   中英

根據條件將數據分組為新的列值

[英]Group data into new column value based of condition

我有如下數據:

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中,即,如果日期位於2/1/2017到2/7/2017之間,則添加一個名為“ week”的新列,並將這些元組的值設置為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的方法。謝謝

一種方法是使用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

您可以直接使用

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

有關格式的更多詳細信息,請參見strptime幫助。 請注意,例如,它只給出一年中的某個星期,因此2017年1月1日將早於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)))

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

但是,您需要提供有關日期分配方式的更多信息,因為周數的計算取決於此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM