2016-07-29 90 views
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" 

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

回答

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) 
       }) 
+1

谢谢@Tim。我不知道为什么当我申请is.infinite()和sapply到列表不起作用。 –

相关问题