找出R中两个时间序列之间最长的非NA公共序列

找出R中两个时间序列之间最长的非NA公共序列,r,dplyr,data-science,R,Dplyr,Data Science,假设我有两个不同长度的时间序列。两者都有time和value列。它们在随机位置都有NA值。例如: # Generate first series series1 <- data.frame( time = seq.POSIXt( from = as.POSIXct("2020-01-01", origin = "1970-01-01"), length.out = 100, by = "

假设我有两个不同长度的时间序列。两者都有
time
value
列。它们在随机位置都有NA值。例如:

# Generate first series
series1 <- data.frame(
    time = seq.POSIXt(
        from = as.POSIXct("2020-01-01", origin = "1970-01-01"),
        length.out = 100,
        by = "1 day"
    ),
    value = runif(100, min = 0, max = 100)
)

# Generate second series, which starts and ends and different times
series2 <- data.frame(
    time = seq.POSIXt(
        from = as.POSIXct("2019-12-01", origin = "1970-01-01"),
        length.out = 80,
        by = "1 day"
    ),
    value = runif(80, min = 0, max = 100)
)

# Remove some values at random
random_idx1 <- sample(seq_len(nrow(series1)), 20)
random_idx2 <- sample(seq_len(nrow(series2)), 20)

series1$value[random_idx1] <- NA
series2$value[random_idx2] <- NA
#生成第一个系列

序列1我们按“时间”进行
全联接
,在逻辑向量上应用游程id(
rle
),即“value.x”和“value.y”的非NA元素,提取
长度
,在“值”为真的地方,获得
max

library(dplyr)
full_join(series1, series2, by = 'time') %>% 
     summarise(len1 = with(rle(!is.na(value.x) &
           !is.na(value.y)), max(lengths[values])))
# len1
#1    5

它返回问题中“series1”和“series2”数据集中“value”列共有的最大非NA元素。series2将于2019年结束,而series1将于2020年开始,因此没有非NA值的运行,因此让我们使用结尾注释中给出的不同示例

1)仅使用基本R,我们就可以做到:

na.contiguous(merge(DF1, DF2, by = 1))
2)或者我们可以改去动物园做同样的事情。使用fortify.zoo(z)将其转换回或保留为zoo。如果需要单独的动物园对象,请使用z$z1和z$z2。请注意,时间(z)是结果中的时间。如果时间间隔规则,也可以使用ts类:as.ts(z)

图书馆(动物园)

z1也许你想通过'time'
merge(series1,series2,by='time',all=TRUE)
对,那么可以在合并的框架上使用na.contracting?我尝试了你的例子,但是我没有找到两个I..e
full\u-join(series1,series2,by='time')%>%摘要(len1=list(rle(!is.na(value.x)&!is.na(value.y))
。可能是因为您构造的示例不正确overlapping@akrun我更新了示例。
library(zoo)
z1 <- read.zoo(DF1)
z2 <- read.zoo(DF2)

z <- na.contiguous(cbind(z1, z2))
z
##   z1 z2
## 3  3 12
## 4  4 13
## 5  5 14
## attr(,"na.action")
## [1] 1 2 6 7
## attr(,"class")
## [1] omit
DF1 <- data.frame(1:6, c(1, 2, 3, 4, 5, NA))
DF2 <- data.frame(2:7, c(NA, 12, 13, 14, 15, 16))