如何在 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 分钟观察一次数据,只有 0
s 的一天可以合理地认为是计数器不工作的一天,从而得出结论,那些 0
s 实际上是 NA
s.
我想查找(并删除)在任何时候至少有 288 个连续 0
的列。或者,更一般地说,我们如何从包含 >=k 个连续 0
的 data.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
我有一个巨大的 data.frame
,其中包含大约 200 个变量,每个变量由一列表示。不幸的是,数据来自格式不正确的数据转储(因此无法修改),它将缺失值和零表示为 0
。
一个月内每 5 分钟观察一次数据,只有 0
s 的一天可以合理地认为是计数器不工作的一天,从而得出结论,那些 0
s 实际上是 NA
s.
我想查找(并删除)在任何时候至少有 288 个连续 0
的列。或者,更一般地说,我们如何从包含 >=k 个连续 0
的 data.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