我有一个列表(这里我认为它是相同的元素),其中一些列表元素中有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"
然而,我无法实现这个目标(可能知道错误是适用的,因为它不能像这样使用。)。关于我们如何做到这一点的任何建议或我可以遵循的任何其他简单方法?
答案 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)
})