代码之家  ›  专栏  ›  技术社区  ›  lolibility

如何更改数据帧列表中的所有0

  •  1
  • lolibility  · 技术社区  · 11 年前

    我想将数据帧列表中的所有0都更改为,比如0.0001,以避免在获取日志时出现-Inf。因此,按照 Replace all 0 values to NA ,我将函数写为

    set_zero_as_value <- function(x, value=0.0001){
        x[x == 0] <- value
    }
    

    然而,当我使用 sapply 到我的数据 sapply(a,set_zero_as_value) ,结果返回为

       s1    s2 
    1e-04 1e-04 
    

    并进一步检查列表a中的0 a 一点也不改变。对此有解决方案吗?

    PS:列表 可以创建为

    > a = NULL
    > a$s1 = rbind(cbind(0,1,2),cbind(3,4,5))
    > a$s2 = rbind(cbind(0,1,2),cbind(3,4,5))
    
    1 回复  |  直到 11 年前
        1
  •  2
  •   Jilber Urbina    11 年前

    使用 pmax 的内部 lapply 调用,无需定义 set_zero_as_value 自从 最大值 做你需要的事。假设您的列表是:

    list.DF <-list(structure(list(a = c(1L, 2L, 3L, 5L, 1L, 5L, 5L, 3L, 3L, 
    0L), b = c(1L, 1L, 4L, 2L, 4L, 2L, 4L, 5L, 2L, 4L), c = c(5L, 
    1L, 3L, 0L, 1L, 2L, 0L, 2L, 5L, 2L)), .Names = c("a", "b", "c"
    ), row.names = c(NA, -10L), class = "data.frame"), structure(list(
        d = c(2L, 3L, 2L, 1L, 4L, 4L, 4L, 0L, 4L, 2L), e = c(4L, 
        3L, 4L, 3L, 3L, 4L, 0L, 2L, 4L, 4L), f = c(2L, 5L, 2L, 1L, 
        0L, 0L, 1L, 3L, 3L, 2L)), .Names = c("d", "e", "f"), row.names = c(NA, 
    -10L), class = "data.frame"))
    

    现在应用您想要的转换:

    > lapply(list.DF, function(x) sapply(x, pmax, 0.0001))
    

    如果您想使用 设置零值 函数,然后添加 return(x) 最后。

    set_zero_as_value <- function(x, value=0.0001){
      x[x == 0] <- value
      return(x)
    }
    
    lapply(list.DF, function(x) sapply(x, set_zero_as_value))
    

    这将产生与以前相同的结果。