1

我想在数据帧列表中将所有 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,其中的0a根本没有变化。有解决方案吗?

PS:列表a可以创建为

> a = NULL
> a$s1 = rbind(cbind(0,1,2),cbind(3,4,5))
> a$s2 = rbind(cbind(0,1,2),cbind(3,4,5))
4

1 回答 1

2

pmax在调用内部使用lapply,无需定义,set_zero_as_value因为pmax可以满足您的需要。假设您的清单是:

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))

如果您想使用您的set_zero_as_value功能,请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))

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

于 2013-10-25T14:52:16.800 回答