2013-10-25 70 views
1

我想在數據框列表中將所有0更改爲0.0001,以避免-Inf何時進行日誌記錄。所以,依照指示從Replace all 0 values to NA,我寫我的功能如何更改數據框列表中的所有0

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 

並進一步檢查列表中,則0 a根本不會改變。有沒有解決方案?

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

你的函數需要返回'x'。 – mrip

+0

並且(希望我不需要指出這一點),您需要將結果賦給某些東西,例如'a < - sapply(a,set_zero_as_value)' –

+0

所以我必須分配結果?我可以簡單地修改一個,因爲如果數據幀非常大,就會有冗餘。或者我稍後再說。 – lolibility

回答

2

使用pmaxlapply呼叫內,無需定義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

+1但是......你的'pmax'解決方案也會改變'x> 0&x <0.0001'數據的值,這可能是不希望的。 –

+0

@ SimonO101你是對的,我忘記了'pmax';) –

相關問題