【问题标题】:Identifying INF values in a list and making it NULL识别列表中的 INF 值并将其设为 NULL
【发布时间】:2016-07-29 23:20:09
【问题描述】:

我有一个列表(这里我认为它是相等的元素),其中一些列表元素中包含 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

我的想法是使用 inf_name_temp 获取索引值

> which(inf_name_temp)

然后使用apply,将其循环到列表元素以使为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" 

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

【问题讨论】:

    标签: r list dataframe


    【解决方案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)
                     })
    

    【讨论】:

    • 谢谢@Tim。我不知道为什么当我申请 is.infinite() 并 sapply 到列表时它不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2017-09-26
    • 2011-10-29
    • 1970-01-01
    相关资源
    最近更新 更多