【问题标题】:How to get na.omit with data.table to only omit NAs in each column如何使用 data.table 获取 na.omit 以仅省略每列中的 NA
【发布时间】:2013-05-29 18:46:26
【问题描述】:

假设我有

az<-data.table(a=1:6,b=6:1,c=4)
az[b==4,c:=NA]
az
   a b  c
1: 1 6  4
2: 2 5  4
3: 3 4 NA
4: 4 3  4
5: 5 2  4
6: 6 1  4

我可以得到所有列的总和

az[,lapply(.SD,sum)]
    a  b  c
1: 21 21 NA

这是我想要的 abc 是 NA。这似乎很容易通过这样做来解决

az[,lapply(na.omit(.SD),sum)]
    a  b  c
1: 18 17 20

这是我想要的c,但我不想省略ab 的值,其中cNA。这是我真实数据中的一个人为示例,其中可能有 1000 多列随机 NA。有没有办法让na.omit 或其他东西在每列而不是在整个表上执行而不依赖于循环遍历每一列作为向量?

【问题讨论】:

  • az[,lapply(.SD,sum,na.rm=TRUE)] 工作吗?
  • @BlueMagister 我没想到。是的,它确实适用于sum,尽管它不适用于没有内置该参数的函数。除非有更好的方法,否则我可以编写自己的函数,这些函数只是我想要的函数的 na.omit比遍历列向量更好。
  • @DeanMacGregor 在这种情况下使用 lambda,例如 az[,lapply(.SD, function(x) length(na.omit(x)))]
  • @MatthewPlourde 谢谢,我不知道你可以像这样即时制作函数。

标签: r data.table


【解决方案1】:

扩展我的评论:

许多base 函数允许您决定如何对待NA。例如,sum 有参数na.rm

az[,lapply(.SD,sum,na.rm=TRUE)]

一般情况下,您也可以对每个向量单独使用函数na.omit

az[,lapply(.SD,function(x) sum(na.omit(x)))]

【讨论】:

  • 好的,这与我建议的基本相同,即通过使 na.omit 函数成为我需要做的事情,除了即时完成。我没想到你能做到。
猜你喜欢
  • 2015-07-07
  • 2021-04-20
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
相关资源
最近更新 更多