R:是-否因素基于先前的记录

时间:2018-07-01 09:53:46

标签: r xts

我有一个时间序列数据集-来自气象站的数据。因此,共有3列:time-时间和日期; p-雨,毫米; h-水位,米。

我需要用factor_rain1值创建一个新列01-如果水位(df$h)受雨(df$p)影响。这可能是最近 5小时 5个条目)下雨了。 在其他情况下,应该有0

数据集的一部分在这里:

df <- data.frame(time = c("2017-06-04 9:00:00", "2017-06-04 13:00:00",  "2017-06-04 17:00:00",
                            "2017-06-04 19:00:00",  "2017-06-04 21:00:00",  "2017-06-04 23:00:00",
                            "2017-06-05 9:00:00",   "2017-06-05 11:00:00",
                            "2017-06-05 13:00:00",  "2017-06-05 16:00:00",
                            "2017-06-05 19:00:00",  "2017-06-05 21:00:00",  "2017-06-05 23:00:00",
                            "2017-06-06 9:00:00",   "2017-06-06 11:00:00",  "2017-06-06 13:00:00",
                            "2017-06-06 16:00:00",  "2017-06-06 17:00:00",  "2017-06-06 18:00:00",
                            "2017-06-06 19:00:00"),
                   p = c(NA, NA, 16.4, NA, NA, NA, NA, NA, NA, NA, 12, 
                         NA, NA, NA, NA, NA, NA, NA, NA, NA),
                   h = c(23,NA,NA,NA,NA,32,NA,NA,28,NA,NA,
                        33,NA,NA,NA,29,NA,NA,NA,NA))

我正在尝试我认为的最简单的方法-不幸的是,它仅适用于一种情况:

> df$factor_rain[df$p[-c(1:5)] > 1 & df$h > 1] <- 1
> Warning message:
In df$p[-c(1:5)] > 1 & df$h > 1 :
  longer object length is not a multiple of shorter object length

有什么办法可以解决?如果您可以建议如何使用实时功能(例如xts库中的某项功能),那就太好了。我的意思是使用5小时的阈值,而不是5个值。

通过这种方式,我需要得到这个结果:

> df
                  time    p  h factor_rain
1   2017-06-04 9:00:00   NA 23           0
2  2017-06-04 13:00:00   NA NA           0
3  2017-06-04 17:00:00 16.4 NA           0
4  2017-06-04 19:00:00   NA NA           0
5  2017-06-04 21:00:00   NA NA           0
6  2017-06-04 23:00:00   NA 32           1
7   2017-06-05 9:00:00   NA NA           0
8  2017-06-05 11:00:00   NA NA           0
9  2017-06-05 13:00:00   NA 28           0
10 2017-06-05 16:00:00   NA NA           0
11 2017-06-05 19:00:00 12.0 NA           0
12 2017-06-05 21:00:00   NA 33           1
13 2017-06-05 23:00:00   NA NA           0
14  2017-06-06 9:00:00   NA NA           0
15 2017-06-06 11:00:00   NA NA           0
16 2017-06-06 13:00:00   NA 29           0
17 2017-06-06 16:00:00   NA NA           0
18 2017-06-06 17:00:00   NA NA           0
19 2017-06-06 18:00:00   NA NA           0
20 2017-06-06 19:00:00   NA NA           0

2 个答案:

答案 0 :(得分:1)

您可以使用

df$factorrain = FALSE
df$factorrain[rowSums(expand.grid(which(!is.na(df$p)), 0:4))] = TRUE

#                   time    p  h factorrain
# 1   2017-06-04 9:00:00   NA 23   FALSE
# 2  2017-06-04 13:00:00   NA NA   FALSE
# 3  2017-06-04 17:00:00 16.4 NA    TRUE
# 4  2017-06-04 19:00:00   NA NA    TRUE
# 5  2017-06-04 21:00:00   NA NA    TRUE
# 6  2017-06-04 23:00:00   NA 32    TRUE
# 7   2017-06-05 9:00:00   NA NA    TRUE
# 8  2017-06-05 11:00:00   NA NA   FALSE
# 9  2017-06-05 13:00:00   NA 28   FALSE
# 10 2017-06-05 16:00:00   NA NA   FALSE
# 11 2017-06-05 19:00:00 12.0 NA    TRUE
# 12 2017-06-05 21:00:00   NA 33    TRUE
# 13 2017-06-05 23:00:00   NA NA    TRUE
# 14  2017-06-06 9:00:00   NA NA    TRUE
# 15 2017-06-06 11:00:00   NA NA    TRUE
# 16 2017-06-06 13:00:00   NA 29   FALSE
# 17 2017-06-06 16:00:00   NA NA   FALSE
# 18 2017-06-06 17:00:00   NA NA   FALSE
# 19 2017-06-06 18:00:00   NA NA   FALSE
# 20 2017-06-06 19:00:00   NA NA   FALSE

或者,采用与之类似的方法

df$factorrain = FALSE
df$factorrain[sapply(which(!is.na(df$p)), function(x) x+(0:4))] = TRUE

答案 1 :(得分:1)

可以使用Stream<T>中的non-equi join实现解决方案。

data.table

注意:该解决方案可以进行一些优化。我将在一段时间内进行优化。