我有成千上万的数据帧,如下表所示。每个表在 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的位置。谢谢
答案 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
当然,我们只关心TRUE
(NA
),因此我们将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=""))