我想在数据帧列表中将所有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,a
中的0根本没有变化。有解决方案吗?
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))
答案 0 :(得分: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))
这将产生与以前相同的结果。