从 r 中的条件开始,将 7 天添加到现有日期
Add 7 days to the existing date starting from a condition in r
我有一个这种格式的数据框:
df1:
Date Week Visitors
2016-09-25 40 100
2016-10-02 41 200
.
.
2016-12-25 52 600
2017-01-08 01 500
2017-01-15 02 1000
2017-01-22 03 2000
.
.
我想从 Date 开始减去 7 天,当 Week ==1 和 Day(2017-01-08) >=7 用于其余数据。
我的数据框是:
df1:
Date Week Visitors
2016-09-25 40 100
2016-10-02 41 200
.
.
2016-12-25 01 600
2017-01-01 01 500
2017-01-08 02 1000
2017-01-15 03 2000
.
.
谁能给我指出正确的方向?
我觉得你问的和我想的大不一样,所以我编辑了我的答案。我想你想要的是每年的支票,这样如果那一年的 "Week == 1" 在 07 年 1 月之前,那么假设第一周是 "missing",然后通过移动所有日期向后 7 天。以下是如何实现的。
首先,我们将创建一个列来指定年份:
library( data.table )
setDT( df1 )
df1[ , Year := format( Date, "%Y" )
]
然后,我们将定义一个函数来检查缺少的第一周,并在适当的情况下移动日期:
checkAndMove <- function( d, w ) {
month.day <- as.integer( format( d, "%m%d" ) )
if( month.day[ w == 1 ] > 0106 ) {
d <- d - 7
}
return( d )
}
然后,我们可以将此函数应用于您选择的某一年:
df1[ Year == 2017, Date := checkAndMove( d = Date, w = Week ) ]
或者,我们可以让 R 运行 一次检查所有年份,仅在函数认为合适时才应用更改:
df1[ , Date := checkAndMove( d = Date, w = Week ), by = Year ]
注意:我没有测试这段代码,因为我没有太多数据可以使用。如果您能提供更多数据,我很乐意 运行 进行测试以确保它的行为符合预期。
我有一个这种格式的数据框:
df1:
Date Week Visitors
2016-09-25 40 100
2016-10-02 41 200
.
.
2016-12-25 52 600
2017-01-08 01 500
2017-01-15 02 1000
2017-01-22 03 2000
.
.
我想从 Date 开始减去 7 天,当 Week ==1 和 Day(2017-01-08) >=7 用于其余数据。
我的数据框是:
df1:
Date Week Visitors
2016-09-25 40 100
2016-10-02 41 200
.
.
2016-12-25 01 600
2017-01-01 01 500
2017-01-08 02 1000
2017-01-15 03 2000
.
.
谁能给我指出正确的方向?
我觉得你问的和我想的大不一样,所以我编辑了我的答案。我想你想要的是每年的支票,这样如果那一年的 "Week == 1" 在 07 年 1 月之前,那么假设第一周是 "missing",然后通过移动所有日期向后 7 天。以下是如何实现的。
首先,我们将创建一个列来指定年份:
library( data.table )
setDT( df1 )
df1[ , Year := format( Date, "%Y" )
]
然后,我们将定义一个函数来检查缺少的第一周,并在适当的情况下移动日期:
checkAndMove <- function( d, w ) {
month.day <- as.integer( format( d, "%m%d" ) )
if( month.day[ w == 1 ] > 0106 ) {
d <- d - 7
}
return( d )
}
然后,我们可以将此函数应用于您选择的某一年:
df1[ Year == 2017, Date := checkAndMove( d = Date, w = Week ) ]
或者,我们可以让 R 运行 一次检查所有年份,仅在函数认为合适时才应用更改:
df1[ , Date := checkAndMove( d = Date, w = Week ), by = Year ]
注意:我没有测试这段代码,因为我没有太多数据可以使用。如果您能提供更多数据,我很乐意 运行 进行测试以确保它的行为符合预期。