从仅包含NA的列表中删除元素?

bic*_*ton 3 r

我想删除此列表中仅包含NA的所有元素:

  List_data <- list("Green", "Yellow", c(NA,NA,NA), TRUE, 51.2)
Run Code Online (Sandbox Code Playgroud)

Jas*_*lns 8

对于一种purrr方法:

library(purrr)

List_data %>%
  map(discard, is.na) %>%
  compact()
Run Code Online (Sandbox Code Playgroud)

请注意,您可以删除compact()并获得“任一”解决方案。


r2e*_*ans 7

如果您的意思是删除整个元素(并且不留下空名称),请尝试:

Filter(function(a) any(!is.na(a)), List_data)
Run Code Online (Sandbox Code Playgroud)

编辑:使用Onyambu的建议(谢谢!)Negate(anyNA),这将是

Filter(Negate(anyNA), List_data)
Run Code Online (Sandbox Code Playgroud)

  • 或在 Onyambu 回答 + 评论的上下文中:`Filter(Negate(anyNA), List_data)`。 (2认同)

Ony*_*mbu 7

你也可以这样做:

List_data[!sapply(List_data, function(x) all(is.na(x)))]
Run Code Online (Sandbox Code Playgroud)

或者正如@snoram 指出的那样:

 List_data[sapply(List_data, Negate(anyNA))]
Run Code Online (Sandbox Code Playgroud)

也可以表示为:

 List_data[!sapply(List_data, anyNA)]
Run Code Online (Sandbox Code Playgroud)

  • +1 表示否定()。来自文档:*anyNA 以可能更快的方式实现 any(is.na(x))(尤其是对于原子向量)。* (2认同)

Rav*_*h13 5

EDIT2:根据akrun的评论,以下内容也可能有所帮助.

List_data[vapply(List_data, function(x) any(!is.na(x)), logical(1))]
Run Code Online (Sandbox Code Playgroud)

编辑:根据Onyambu的评论可能有助于删除其中包含NA的完整元素,感谢Onyambu在此指导.

List_data[!sapply(List_data, function(x) all(is.na(x)))]
Run Code Online (Sandbox Code Playgroud)

你可以试试以下:

lapply(List_data, function(x) x[!is.na(x)])
Run Code Online (Sandbox Code Playgroud)