使用R创建包含基于日期时间的连续计数的向量

时间:2018-10-02 19:59:07

标签: r

我在R中有一个数据框,如下所示...

Year  Month  Day  Hour DateTime 
1950  1      4    12   1/4/1950 12:00
1950  1      4    13   1/4/1950 13:00
1950  1      4    14   1/4/1950 14:00
1950  1      4    15   1/4/1950 15:00
1950  1      4    18   1/4/1950 18:00
1950  1      4    21   1/4/1950 21:00
1950  1      4    22   1/4/1950 22:00
1950  1      5    23   1/5/1950 23:00

数据来自年份(1950-2017)和月份(1-12)天(1-31)小时(0-23),我想创建一个向量,将连续的观测值相加,即彼此对立的观察。 例如,创建的列向量中的前几个数字应为(4,1,3),因为前四个观察值是连续的,下一个不是连续的,然后下三个是连续的。

2 个答案:

答案 0 :(得分:4)

我们用difftime检查相邻日期之间的差,检查差是否不等于1,使用rle来获取计数

dt <- as.POSIXct(df1$DateTime, format = "%m/%d/%Y %H:%M")
rle(cumsum(c(TRUE, difftime(dt[-1], dt[-length(dt)], unit = "hour") != 1)))$lengths
#[1] 4 1 2 1

或者如@Ryan所述,也可以使用diff

rle(cumsum(c(TRUE, diff(dt, unit = "hour") != 1)))$lengths

数据

df1 <- structure(list(Year = c(1950L, 1950L, 1950L, 1950L, 1950L, 1950L, 
1950L, 1950L), Month = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Day = c(4L, 
4L, 4L, 4L, 4L, 4L, 4L, 5L), Hour = c(12L, 13L, 14L, 15L, 18L, 
21L, 22L, 23L), DateTime = c("1/4/1950 12:00", "1/4/1950 13:00", 
"1/4/1950 14:00", "1/4/1950 15:00", "1/4/1950 18:00", "1/4/1950 21:00", 
"1/4/1950 22:00", "1/5/1950 23:00")), class = "data.frame", row.names = c(NA, 
 -8L))

答案 1 :(得分:3)

我们可以使用clf = svm.SVC(kernel='linear', C=1) scores = cross_val_score(clf, X, y, cv=10) print scores 工具和tidyverse创建连续运行的组索引,然后获取每个组中的行数。请注意,由于数据的最后一行与倒数第二行不是连续的,因此我不会重现您的预期输出。

cumsum

reprex package(v0.2.0)于2018-10-02创建。