【问题标题】:Count values which are different from NA and discard column if result is greater than threshold如果结果大于阈值,则计算与 NA 不同的值并丢弃列
【发布时间】:2014-07-31 18:13:11
【问题描述】:

我正在尝试在 data.table 对象中验证哪些列的非空数据(不是 NA)值大于某个阈值(例如:5),然后丢弃未传入的列标准。

考虑以下数据:

require(data.table)
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,NA,6), v=c(1,2,NA,NA,NA,NA,NA,8,9))
DT
   x  y  v
1: a  1  1
2: a NA  2
3: a  6 NA
4: b  1 NA
5: b NA NA
6: b  6 NA
7: c  1 NA
8: c NA  8
9: c  6  9

在上面的例子中,列 v 只有 4 个非 NA 值,小于 5,所以我想丢弃该列:

DT[,c(3) := NULL]
DT
   x  y
1: a  1
2: a NA
3: a  6
4: b  1
5: b NA
6: b  6
7: c  1
8: c NA
9: c  6

我需要帮助来了解如何将 .N* 符号和“if 语句”与 data.table 结合以检查具有多列的对象。

我的问题是,我怎样才能以编程方式在所有列中进行计数,并且只丢弃未通过标准的那些?谢了。

*我不确定是否需要.N,但从之前的研究中我了解到这个符号用于对 data.table 对象进行计数

【问题讨论】:

    标签: r if-statement data.table na


    【解决方案1】:

    这是一种方法:

    DT[, which(lapply(DT, function(x) sum(!is.na(x))) < 5) := NULL]
    

    由于data.table 是一个列列表,lapply 循环遍历各个列并应用所需的函数。然后which 枚举我们感兴趣的列,:= 删除它们。

    【讨论】:

    • Tks,这行得通(+1)。如果 data.table 对象中有 100 万行,这会有效吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多