从拆分的列表中确定NA和无限(INF)值,并使包含INF,NA值的元素为NULL

时间:2016-08-04 20:18:39

标签: r list dataframe

您好我有一个已被用户拆分的列表。列表的结构是

> lst
$A
timestamp user value
2011-01-01 A    1184437
2011-02-01 A    1197000
2011-03-01 A    1483965
2011-04-01 A    1248051
2011-05-01 A    1285838

$B
timestamp user value
2011-01-01 B    12315
2011-02-01 B    12325345
2011-03-01 B    1235223
2011-04-01 B    Inf
2011-05-01 B    Inf

$C
timestamp user value
2011-01-01 C    NA
2011-02-01 C    NA
2011-03-01 C    1181080
2011-04-01 C    1326289
2011-05-01 C    1264455

在运行时期间,我想确定列表中的任何元素是否包含INF或NA值。如果是,则将元素的名称存储在其他位置,并使列表中的该元素为NULL。我一直在尝试使用 is.infinite()来捕获INF值,但它不能正常表示错误

invalid subscript type 'list'

使用的代码:

NA_names <-  names(lst)[sapply(lst, function(x) sum(is.na(x)) > 0)]    
inf_names <- names(lst)[sapply(lst, function(x) sum(is.infinite(x)) > 0)]

对此有何帮助或建议?由于sapply适用于数据框,我不确定使用哪种方法。

2 个答案:

答案 0 :(得分:1)

您可以使用purrr包执行此操作:

library(purrr)

drops <- map(lst, 'value') %>% # extract the 'value' column from each data.frame
  keep(~ any(!is.finite(.))) %>% # keep only items with non-finite values
  names() # get the names of the remaining list items

lst[drops] <- NULL

purrr::map的工作原理与lapply类似,只是它为您提供了方便的快捷方式,用于提取列表中的元素(比如使用字符串从data.frame中提取列,如示例所示)。 purrr::keep遍历列表,只保留满足您指定的逻辑条件的元素。

答案 1 :(得分:1)

像嵌套sapply这样的东西应该可以使用假设列表元素由data.frames组成。

# get the list elements that have any infinite value within
keepers <- !sapply(myList, function(i) any(sapply(i, is.infinite)))
keepers
    a     b     c 
 TRUE FALSE  TRUE 

# get new list
myNewList <- myList[keepers]

# print names of dropped list items
names(keepers)[keepers]
[1] "b"