2016-10-03 46 views
0

隨後替換列值我有一個列表,「na.list」,包含23個數據幀:在數據幀基於條件的第一列

str(na.list) 
List of 23 
$ YFB:'data.frame': 4383 obs. of 8 variables: 
    ..$ Obs  : num [1:4383] 1 1 1 1 1 1 1 1 1 1 ... 
    ..$ Day.1.AM: num [1:4383] 1 1 1 1 1 1 1 1 1 1 ... 
    ..$ Day.2.AM: num [1:4383] 1 1 1 1 1 1 1 1 1 1 ... 
    ..$ Day.3.AM: num [1:4383] 1 1 1 1 1 1 1 1 1 1 ... 
    ..$ Day.4.AM: num [1:4383] 1 1 1 1 1 1 1 1 1 1 ... 
    ..$ Day.5.AM: num [1:4383] 1 1 1 1 1 1 1 1 1 1 ... 
    ..$ Day.6.AM: num [1:4383] 1 1 1 NA 1 1 1 1 1 1 ... 
    ..$ Day.7.AM: num [1:4383] NA NA NA NA NA NA NA NA NA NA ... 
$ YFC:'data.frame': 4383 obs. of 8 variables: 
    ..$ Obs  : num [1:4383] 1 1 1 1 1 1 1 1 1 1 ... 
    ..$ Day.1.AM: num [1:4383] 1 1 1 1 1 1 1 1 1 1 ... 
    ..$ Day.2.AM: num [1:4383] 1 1 1 1 1 1 1 1 1 1 ... 
    ..$ Day.3.AM: num [1:4383] 1 1 1 1 1 1 1 1 1 1 ... 
    ..$ Day.4.AM: num [1:4383] 1 1 1 1 1 1 1 1 1 1 ... 
    ..$ Day.5.AM: num [1:4383] 1 1 1 1 NA 1 1 1 1 1 ... 
    ..$ Day.6.AM: num [1:4383] NA NA NA NA NA NA NA NA 1 1 ... 
    ..$ Day.7.AM: num [1:4383] NA NA NA NA NA NA NA NA NA NA ... 

等等。我想要做的是用零替換所有的NA值。我這樣做是使用:

set.na<-function(x,y){replace(x[,y],is.na(x[,y]),0)} 
na.list<-lapply(na.list,set.na,y=(1:8)) 

的問題是,如果第一列「觀測值」爲NA,那麼所有的後續列的應該是爲好。所以,我曾試圖做到以下幾點:

set.obs.na<- function(x,y){{replace(x[,y],is.na(x[,1]),0)}} 
na.list<-lapply(all.dat,set.obs.na,y=(1:8)) 
set.na<-function(x,y){replace(x[,y],is.na(x[,y]),0)} 
na.list<-lapply(na.list,set.na,y=(2:8)) 

凡想法是,第一功能將設置基於「OBS」列第一的0值,然後計算各列的其餘部分。 的「set.obs.na」功能不起作用,並返回錯誤:

Error in [<-.data.frame (*tmp* , list, value = 0) : attempt to select more than one element

我不太確定如何最好地實現我想要的結果,所以任何建議將不勝感激。

如下的建議,我會提供一個工作的例子來說明我的問題:

我有數據幀的列表:

df.list<- list(df1 = data.frame(x=c(1,NA, 1,NA), y = c(NA,1,1,1), z=c(1,1,1,NA)), 
df2 = data.frame(x = c(NA, NA, 1,1), y=c(1,1,1,1), z=c(NA,1,NA,1))) 

我想要替換的NA與零值。不過,我首先想要使用x列NAs來確定y和z列中的值。因此,如果x列中的值爲NA,則無論y,z列中的值是多少,都將被零覆蓋。所以在上面的例子中,df1中的y和z列將有2和3的值寫入零。 我試着用下面這樣:

set.obs.na<- function(a,b){{replace(a[,b],is.na(a[,1]),0)}} 
df.list<-lapply(df.list,set.obs.na,b=(1:3)) 

但我得到以下錯誤:如果相應的

Error in [<-.data.frame (*tmp* , list, value = 0) : attempt to select more than one element

有沒有一種簡單的方法以0比替換y和z列的值x值是NA?

+1

你可以改善你的問題。請閱讀[如何在R中提供最小重現性示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example#answer-5963610)。然後可能相應地編輯和改進它。好的帖子通常提供最少的輸入數據,所需的輸出數據和代碼嘗試 - 在新的/乾淨的R會話中進行全部複製 - 粘貼 - 運行。要替換數據幀列表中的NA,您可以使用lst < - list(df1 = data.frame(x = c(1,NA,3),y = NA),df2 = data.frame a = c(NA,NA,10))); lapply(lst,function(df){df [is.na(df)] < - 0; df})'。 – lukeA

+0

謝謝。我會記住按照您在下次建議的方式創建一個示例。 –

+0

用零替換每列中的NA值對我來說不是問題,而是使用第一列來確定導致問題的後續列。我已經按照建議更新了我的示例。 –

回答

0

如果我們需要改變的基礎上在第一列的NA值位置的所有其它列的位置,我們可以將「set.na」改爲

set.na <- function(x) replace(x[-1], is.na(x[1]), 0) 
new.list <- lapply(na.list, set.na)