1
我有一个列表(这里我认为它是相同的元素),其中一些列表元素中包含INF值。该列表被定义为在列表中标识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)))
但是,这似乎不适用于列表。我目前正在使用一个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
我的想法是使用
> which(inf_name_temp)
摆脱inf_name_temp索引值,然后使用申请,循环播放的列表元素来抵消这是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"
列表不过,我不能够实现这一目标(可能知道错误是适用的,因为它不能像这样使用)。有关我们如何做到这一点的任何建议,或者我可以遵循的其他任何简单方法?
谢谢@Tim。我不知道为什么当我申请is.infinite()和sapply到列表不起作用。 –