R日期序列 - 不是按天增加,而是按行/观察增加

时间:2017-05-01 23:57:45

标签: r date sequence

我正在尝试从数据框中选择日期范围(稍后也是所述数据框中的参与者)。通常,如果您希望将日期范围增加几天,这相对容易。

我的问题是我不希望增加数天,而是按行来查看何时进行100次观察。我想问题是我的数据框中没有连续几天,否则我可以做min(as.Date(data$date) + days(100)

我也试过seq.Date(min(as.Date(data$date), length.out = 100, by = 1)),但这也行不通。

以下是一些示例数据:

dates <- data.frame(date = c("2015-01-08", "2015-01-05", "2015-01-05", 
"2014-12-22", "2014-11-08", "2014-11-01", "2014-10-24", "2014-10-24", 
"2014-10-18", "2014-09-26", "2014-09-21", "2014-09-19", "2014-08-14", 
"2014-08-08", "2014-08-08", "2014-07-10", "2014-07-10", "2014-06-23", 
"2014-06-20", "2014-06-13", "2014-06-11", "2014-06-07", "2014-06-03", 
"2014-06-02", "2014-05-23", "2014-05-16", "2014-05-02", "2014-04-25",
"2014-04-11", "2014-04-09", "2014-04-01", "2014-03-27", "2014-03-25",
"2014-03-20", "2014-03-14", "2014-03-06", "2014-03-01"))

现在,当我跑:seq.Date(min(as.Date(dates$date)), length.out = 20, by = 1)时,我确实得到了20个日期:

[1] "2014-03-01" "2014-03-02" "2014-03-03" "2014-03-04" "2014-03-05" "2014-
03-06" "2014-03-07"
[8] "2014-03-08" "2014-03-09" "2014-03-10" "2014-03-11" "2014-03-12" "2014-
03-13" "2014-03-14"
[15] "2014-03-15" "2014-03-16" "2014-03-17" "2014-03-18" "2014-03-19" "2014-
03-20"

但是:那些是与数据框中的日期不匹配的连续日期,所以我无法告知从最低​​/最早日期开始的100次观察。

任何帮助将不胜感激!我相信我不能成为唯一遇到这个问题的人......虽然在这里找不到任何东西。

2 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

N = 20 # set N to be find difference between 1st and Nth time period
diff(sort(as.Date(dates$date))[c(1,N)])
# Time difference of 114 days

打破这种情况:1)sort(as.Date(dates$date))将字符向量转换为日期类型,并按升序排列。 2)[c(1,N)]子集以查找最早的(第一个)日期和第N个之后的日期。 3)diff()计算两个日期之间的差异。

答案 1 :(得分:0)

感谢@dww的帮助,我能够构建以下函数,它可以很好地工作(随意使用):

    time_to_100 <- function(dataframe){

    N = 100 # set number of observations you want to 'check'

    output <- vector("double", length(levels(dataframe$part_id))) 
    # output vector based on number of indiv. part_ids (part_id = factor)

    for(part in dataframe$part_id){
       output[[part]] <-
    as.numeric(diff(sort(as.Date(dataframe[dataframe$part_id == 
    part,]$created))[c(1,N)]), units = "days") # created = the date column
    }

    return(output)
    }