如何从嵌套列表中正确省略NA?

时间:2011-10-27 19:24:39

标签: r

我正在使用列表列表 - 我们称之为L - 在R中,其中子列表的长度和长度都相同。用NA填充。理想情况下,我只想从每个子列表中删除NA元素,我提出的一个解决方案是L <- lapply(L, na.omit)。它似乎几乎工作;但是,对于每个子列表,行为都是这样的,例如,

[[1]]
[1] "0"     "12345"  "12346"  "12347" "12348"  "12349"  "12340"  "12341"  "12342" NA      NA          NA      NA      NA      NA     

[16] NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA    

变为

[[1]]
[1] "0"     "12345"  "12346"  "12347" "12348"  "12349"  "12340"  "12341"  "12342"
attr(,"na.action")
[1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
attr(,"class")
[1] "omit"

我有点困惑,说实话 - 我的清单中有多少attr()等等?那里有解决方案,不会将它们附加到列表中吗?我尝试了na.exclude,但它给出了相同的结果。有什么我想念的吗?在此先感谢:)

2 个答案:

答案 0 :(得分:8)

没有理由感到困惑...... ?na.omit的详细信息部分说:

  

如果'na.omit'删除了案例,则案例的行号构成   '“na.action”'结果的属性,类'“省略”'。

尝试使用is.na对每个列表元素进行子集化:

L <- lapply(L, function(x) x[!is.na(x)])

答案 1 :(得分:3)

使用更高阶函数的另一种解决方案

lapply(L, Filter, f = Negate(is.na))