如何在 R data.frame 中查找和删除包含超过 k 个连续零的列?

How to find and remove columns containing more than k consecutive zeros in R data.frame?

我有一个巨大的 data.frame,其中包含大约 200 个变量,每个变量由一列表示。不幸的是,数据来自格式不正确的数据转储(因此无法修改),它将缺失值和零表示为 0。 一个月内每 5 分钟观察一次数据,只有 0s 的一天可以合理地认为是计数器不工作的一天,从而得出结论,那些 0s 实际上是 NAs.

我想查找(并删除)在任何时候至少有 288 个连续 0 的列。或者,更一般地说,我们如何从包含 >=k 个连续 0data.frame 中删除列?

我对 R 比较陌生,非常感谢任何帮助。谢谢!

编辑:这是一个可重现的例子。考虑到 k=4,我想删除 A 和 B 列(但不是 C,因为 0 不是连续的)。

df<-data.frame(A=c(4,5,8,2,0,0,0,0,6,3), B=c(3,0,0,0,0,6,8,2,1,0), C=c(4,5,6,0,3,0,2,1,0,0), D=c(1:10))
df
   A B C D
1  4 3 4  1
2  5 0 5  2
3  8 0 6  3
4  2 0 0  4
5  0 0 3  5
6  0 6 0  6
7  0 8 2  7
8  0 2 1  8
9  6 1 0  9
10 3 0 0 10

您可以对您的数据使用此功能:

cons.Zeros <- function (x, n)
{
    x <- x[!is.na(x)] == 0
    r <- rle(x)
    any(r$lengths[r$values] >= n)
}

此函数returns TRUE 用于需要删除的列。 n 是您希望删除列的连续零的数量。

对于您的样本数据集,我们使用 n = 3;

df.dropped <- df[, !sapply(df, cons.Zeros, n=3)]

#output:
# > df.dropped 

#    C  D 
# 1  4  1 
# 2  5  2 
# 3  6  3 
# 4  0  4 
# 5  3  5 
# 6  0  6 
# 7  2  7 
# 8  1  8 
# 9  0  9 
# 10 0 10