2016-05-15 184 views
-1

我在充满日期的数据集中有一列,我想用周值替换它们。有没有办法设置特定的日期范围(例如2016年1月1日至2016年1月7日),并且每次该范围内的任何日期似乎都会用另一个值(例如第1周)替换。感谢您的任何帮助!在R中替换一系列列值

下面是我工作的数据集:

Text Date   
Text 1 2016-02-05 10:55:00 
Text 2 2016-02-09 10:56:28 
Text 3 2016-02-18 20:40:33 


Desired output: 

Text Date   
Text 1 Week 1 
Text 2 Week 2 
Text 3 Week 3 
+0

这取决于你的日期变量,如果你的日期是一个单一的一年内,你可以在'lubridate'包中使用'week()'函数来获取星期编号。但是如果它跨越多年,你需要做一些像'cut'这样的转换。 – Psidom

+0

这个星期是一个学期的几周。他们从一月底开始运行至今,共有12人。这会影响事情吗? – Claire

+0

只要在一年内,就可以使用'week()'函数。 – Psidom

回答

0

继在评论中澄清,此代码应产生预期的输出:

SemStartWeek <- 5 #variable introduced to avoid obscure "magic numbers" in code 
df1$Date <- paste("Week",as.numeric(strftime(df1$Date),"%W")) - SemStartWeek + 1) 
# Text Date 
#1 Text 1 Week 1 
#2 Text 2 Week 2 
#3 Text 3 Week 3 

数据

df1 <- structure(list(Text = structure(1:3, .Label = c("Text 1", "Text 2", 
       "Text 3"), class = "factor"), Date = structure(1:3, 
       .Label = c("2016-02-05 10:55:00", "2016-02-09 10:56:28", 
       "2016-02-18 20:40:33"), class = "factor")), .Names = c("Text", 
       "Date"), class = "data.frame", row.names = c(NA, -3L)) 
+0

这是一年中的一周。如果我没有弄错,我认为他们想要在这个月的周末 –

+0

这是一个学期的几周。所以有1-12,他们从1月底开始。 – Claire

+0

@Claire感谢您的澄清;我相应地更新了代码。它不检查提供的日期是否属于学期,所以输出不一定限于“第1周”到“第12周”。处理无效数据的异常处理很容易在代码中引入,但似乎超出了这个问题的范围。 – RHertel

0

最好使用lubridate的wday。首先安装它,如果你没有的话:

install.packages("lubridate") 

举个简单的例子:

library(lubridate) 
mydate <- as.Date("2016-02-05 10:55:00", format = "%Y-%m-%d") 
wday(mydate) 

PS:1是星期日。

为了整个列做:

dat$Week <- wday(
    as.Date(dat$Date, format = "%Y-%m-%d") 
) 

如果这个回答您的问题好心将其标记为解决& /或赞成票它。

+0

它说lubridate库不存在? – Claire

+0

你需要安装它,'install.packages(“lubdridate”)' – user10853