识别列表中的INF值并使其为NULL

时间:2016-07-29 23:20:10

标签: r list dataframe

我有一个列表(这里我认为它是相同的元素),其中一些列表元素中有INF值。该列表定义为

cid <- c('X','Y','Z')
uid <- c('A','B','C','P','Q','R',NA)
mid <- c('1393','1398')
c1 <- c(5,4,6,5,1,10,Inf,15,18,13,19,Inf,Inf,2)
c2 <- c(15,18,13,19,Inf,Inf,2)
c3 <- c(Inf,1)
test <- list(cid,uid,mid,c1,c2,c3)
names(test) <- c('cid','uid','mid',"c1","c2","c3")

> test
$cid
[1] "X" "Y" "Z"

$uid
[1] "A" "B" "C" "P" "Q" "R" NA 

$mid
[1] "1393" "1398"

$c1
[1]   5   4   6   5   1  10 Inf  15  18  13  19 Inf Inf   2

$c2
[1]  15  18  13  19 Inf Inf   2

$c3
[1] Inf   1

现在我想检查列表中的元素是否存在INF值。如果任何元素具有INF值 1.将该元素名称存储在单独的向量/列表/数据框中(任何可行的) 2.使原始列表中的元素为NULL

要检查Dataframes列中的无限值,我将 is.infinite()与sapply结合使用。像

这样的东西
inf_values <- sapply(df, function(x)any(is.infinite(x))) 

但是,这似乎与list无关。我目前正在使用像

这样的for循环
> for (i in 1:length(test)){
    inf_name_temp[i] = ifelse(sum(any(is.infinite(test[[i]]))) > 0,1,0)
}
> inf_name_temp
[1] 0 0 0 1 1 1

我的想法是使用

从inf_name_temp获取索引值
> which(inf_name_temp)

然后使用apply,将其循环到list元素以使null为元素无效。此外,temp_list可以知道哪个元素具有INF值

> inf_check <- apply(which(inf_name_temp==1),1,new_list)
> new_list <- function(x){
  temp_list <- test[[x]]
  test[[x]] <- NULL
  }

错误是

Error in apply(which(inf_name_temp == 1), 1, new_list) : 
dim(X) must have a positive length

最终目标是获得像

这样的列表
> test
$cid
[1] "X" "Y" "Z"

$uid
[1] "A" "B" "C" "P" "Q" "R" NA 

$mid
[1] "1393" "1398"

> temp_list
[1] "cid" "uid" "mid" 

然而,我无法实现这个目标(可能知道错误是适用的,因为它不能像这样使用。)。关于我们如何做到这一点的任何建议或我可以遵循的任何其他简单方法?

1 个答案:

答案 0 :(得分:1)

要获取具有无限值的列表元素的名称,可以使用sapply

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

要使用NULL替换列表中的无限值,您可以使用lapply返回列表:

df <- lapply(df, function(x) {
                     x[is.infinite(x)] <- NULL
                     return(x)
                 })