在period.apply上忽略NAs

时间:2018-06-14 12:19:40

标签: r xts na

我目前有一个包含多个列和行的xts,其中可以存在一些NA,就像下面看到的那样:

     utc          VR1_40 VR2_40 VR3_40  Q1_40   Q2_40   Q3_40
16.05.18 01:49:20   4   4   4   400 400 400
16.05.18 01:50:20   5   5   5   500 500 500
16.05.18 01:54:48   5   5   5   500 500 500
16.05.18 01:57:54   5   5   5   500 500 500
16.05.18 01:59:54   5   5   5   500 500 500
16.05.18 02:00:16   null    2   2   200 200 null
16.05.18 02:03:10   2   null    2   200 200 null
16.05.18 02:07:12   2   2   null    200 null    200
16.05.18 02:09:52   2   2   2   null    200 null
16.05.18 03:09:52   3   3   3   300 300 300

我希望得到10分钟的平均值,所以我应用以下代码:

means.xts <- period.apply(ts, endpoints(ts, "mins", k=10), FUN=mean)

问题是单个NA将在整个10分钟的平均值中输出NA。

                      VR1_40 Q1_40 VR2_40 Q2_40 VR3_40 Q3_40
2018-05-16 01:49:20      4   400      4   400      4   400
2018-05-16 01:59:54      5   500      5   500      5   500
2018-05-16 02:09:52     NA    NA     NA    NA     NA    NA
2018-05-16 03:09:52      3   300      3   300      3   300

像这样使用na.omit

means.xts <- period.apply(na.omit(ts), endpoints(na.omit(ts), "mins", k=10), FUN=mean)

将从结果中排除整个NA行。

定义一个像这样的自定义均值函数

means.xts <- period.apply(na.omit(ts), endpoints(na.omit(ts), "mins", k=10), FUN = function(x){mean(x, na.rm = TRUE)})

将所有列平均为一个列。

似乎有一些我想念的简单......感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

一种解决方案是将na.rm设置为True。 像这样:

means.xts <- period.apply(na.omit(ts), endpoints(na.omit(ts), "mins", k=10), FUN = mean,na.rm=T)