仅检查R中的连续NA值

时间:2018-07-13 21:44:18

标签: r

我有成千上万的数据帧,如下表所示。每个表在 value 列中有60行,NA数量在1到5之间。这些NA值位置是随机的,可以连续出现,也可以分散在60行中。我正在尝试在R中编写一个代码,如果在表的开头,中间或结尾的任意位置仅存在5个连续的NA,则跳过这样的表。我当时正在考虑使用 for 循环,该循环一次选择60行,请检查5个连续的NA,如果存在,请跳至下一个60行。除了使用 for 循环外,我没有其他解决方案。任何帮助将不胜感激。

+----------+-----------+-----------+-------+
| filename |   date    | window_no | value |
+----------+-----------+-----------+-------+
| 157E     | 5/28/2017 |         1 |    NA |
| 157E     | 5/28/2017 |         1 |    NA |
| 157E     | 5/28/2017 |         1 |    NA |
| 157E     | 5/28/2017 |         1 |    NA |
| 157E     | 5/28/2017 |         1 |    NA |
| 157E     | 5/28/2017 |         1 |    78 |
| 157E     | 5/28/2017 |         1 |    83 |
| 157E     | 5/28/2017 |         1 |    89 |
| 157E     | 5/28/2017 |         1 |    99 |
| 157E     | 5/28/2017 |         1 |    NA |
| 157E     | 5/28/2017 |         1 |    NA |
| 157E     | 5/28/2017 |         1 |   115 |
| 157E     | 5/28/2017 |         1 |   117 |
| 157E     | 5/28/2017 |         1 |   119 |
| 157E     | 5/28/2017 |         1 |   120 |
| 157E     | 5/28/2017 |         1 |   121 |
| ....     | .......   |      .... |  .... |
| 157E     | 5/28/2017 |         1 | 122.5 |
+----------+-----------+-----------+-------+

我想到了使用rle函数在表中查找连续NA的方法,但是无法找出算法来查找连续NA的位置。谢谢

2 个答案:

答案 0 :(得分:1)

您的rle想法是正确的。在样本向量x上,

with(rle(is.na(x)), max(lengths[values]) >= 5)
如果连续有5个或更多NA,则

将为TRUE。只需将your_data$value用于x


为说明起见,让我们获取一些示例数据

x = c(1,1,1,1,1,1,1,1, NA, 1,1, NA, NA, NA, NA, NA, 1)

稍微缩小一下,rle(is.na(x1))给出了NA(在is.na之后为TRUE)和非NA(在is.na之后为FALSE)的行程长度

rle(is.na(x))
# Run Length Encoding
#   lengths: int [1:5] 8 1 2 5 1
#   values : logi [1:5] FALSE TRUE FALSE TRUE FALSE

当然,我们只关心TRUENA),因此我们将lengths的子集values子集化,并保持与真值。

with(rle(is.na(x)), lengths[values])
# [1] 1 5

然后,就像查看剩余的max并查看其是否超出阈值一样简单。

答案 1 :(得分:0)

更原始的方法:将字符串中的NA转换为1的序列,并使用grep匹配“ 11111”,后者也匹配比5长的1的序列。

grepl('[1]{5}', paste0(as.character(as.integer(is.na(x$value))),collapse=""))