【问题标题】:How to find and remove columns containing more than k consecutive zeros in R data.frame?如何在 R data.frame 中查找和删除包含超过 k 个连续零的列?
【发布时间】:2017-11-11 15:21:32
【问题描述】:

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

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

我对 R 比较陌生,如果有任何帮助,我将不胜感激。谢谢!

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

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

【问题讨论】:

  • 您介意发布您的数据的简短格式吗?看看here。你会更容易找到帮助
  • 如果您阅读 @DJJ 链接并提供示例数据集,我可以向您展示如何使用 sapply 对您的数据使用该函数。
  • @DJJ 添加示例数据
  • @Masoud 接受了您的回答。谢谢

标签: r dataframe data-cleaning


【解决方案1】:

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

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

此函数为需要删除的列返回TRUEn 是您希望删除列的连续零的数量。

对于您的示例数据集,让我们使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多