我有一个列表“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))
问题是如果第一列“Obs”是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”函数不起作用,并返回错误:
[<-.data.frame
(*tmp*
,列表,值= 0)出错: 尝试选择多个元素
我不太确定如何最好地达到我想要的结果,所以我们将非常感谢任何建议。
如下所述,我将提供一个工作示例来说明我的问题:
我有一个数据框列表:
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列将具有0和0的oevrwritten值。 我试着这样做:
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))
但是我收到以下错误:
[<-.data.frame
(*tmp*
,列表,值= 0)出错:尝试 选择多个元素
如果相应的x值为NA,是否有一种简单的方法可以将y和z列中的值替换为0?
答案 0 :(得分:0)
如果我们需要根据第一列中的NA值位置更改所有其他列中的位置,我们可以更改&#39; set.na&#39;到
set.na <- function(x) replace(x[-1], is.na(x[1]), 0)
new.list <- lapply(na.list, set.na)