【问题标题】:How to change all 0's in a list of dataframes如何更改数据框列表中的所有 0
【发布时间】:2013-10-25 14:45:16
【问题描述】:

我想在数据帧列表中将所有 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))

【问题讨论】:

  • 你的函数需要返回x
  • 并且(希望我不需要指出这一点)您需要将结果分配给某些东西,例如a &lt;- sapply(a,set_zero_as_value)
  • 所以我必须分配结果?我可以简单地修改一个吗,因为如果数据帧非常大,就会有冗余。或者我稍后再回复。
  • @lolibility 使用data.table 包中的data.table通过引用。 R 显然是 pass-by-value 并且将对您使用的几乎所有对象执行 copy-on-modify。

标签: r list sapply


【解决方案1】:

lapply 调用中使用pmax,无需定义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))

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

【讨论】:

  • +1 但是...您的pmax 解决方案还将更改数据中x &gt; 0 &amp; x &lt; 0.0001 的值,这可能不受欢迎。
猜你喜欢
  • 2019-12-02
  • 2022-01-14
  • 2021-09-25
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2019-04-26
  • 2017-01-16
相关资源
最近更新 更多