您好我有一个已被用户拆分的列表。列表的结构是
> 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适用于数据框,我不确定使用哪种方法。
答案 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"