使用for循环和lapply将循环输出分配给列表

时间:2014-02-20 14:18:03

标签: r for-loop lapply

我正在分析某些物质随时间的降解情况。脚本的目标是在应用之后的某个时间获得包含观察方差的列表(" Dag"变量)。

下面脚本的输出是一个包含NULL值的列表。我认为问题在于我将变量aux1赋值给列表项,但是当我通过命令行执行时,该行有效。

可能有更快的计算方法;即使在2个月后,我仍然感到不知所措。

mydata1<-as.data.frame(matrix(rnorm(600),ncol=6))
names(mydata1)=c("a","b","c","d","e","f")
substance1<-names(mydata1)
times1<-as.data.frame(rep(seq_len(10),10),ncol=1)
names(times1)<-"Dag"
times2<-unique(times1)
mydata1<-cbind(times1,mydata1)

vartijd<-function(times,mydata,substance){
  varlist<<-vector("list",length(substance))
  for (j in 1:length(substance))
    aux<-sapply(times,function(i)var(mydata[mydata$Dag==i,substance[j]],na.rm=TRUE))
    aux1<-cbind(times,aux)
  varlist[[j]]<-aux1

}
vartijd(times2,mydata1,substance1)

1 个答案:

答案 0 :(得分:1)

对代码进行基本修复,这样可以正常工作。

vartijd<-function(times,mydata,substance){
  varlist<-vector("list",length(substance)) # local `<-` assignment
  for (j in 1:length(substance)){ # opening bracket
    aux<-sapply(times,function(i)var(mydata[mydata$Dag==i,substance[j]],na.rm=TRUE))
    aux1<-cbind(times,aux)
    varlist[[j]]<-aux1
  } # closing bracket
  return(varlist) # explicit return
}

结果:

> out <- vartijd(times2,mydata1,substance1)
> str(out)
List of 6
 $ :'data.frame':       10 obs. of  2 variables:
  ..$ Dag: int [1:10] 1 2 3 4 5 6 7 8 9 10
  ..$ aux: num [1:10] 0.997 0.997 0.997 0.997 0.997 ...
 $ :'data.frame':       10 obs. of  2 variables:
  ..$ Dag: int [1:10] 1 2 3 4 5 6 7 8 9 10
  ..$ aux: num [1:10] 0.891 0.891 0.891 0.891 0.891 ...
 $ :'data.frame':       10 obs. of  2 variables:
  ..$ Dag: int [1:10] 1 2 3 4 5 6 7 8 9 10
  ..$ aux: num [1:10] 1.08 1.08 1.08 1.08 1.08 ...
 $ :'data.frame':       10 obs. of  2 variables:
  ..$ Dag: int [1:10] 1 2 3 4 5 6 7 8 9 10
  ..$ aux: num [1:10] 0.927 0.927 0.927 0.927 0.927 ...
 $ :'data.frame':       10 obs. of  2 variables:
  ..$ Dag: int [1:10] 1 2 3 4 5 6 7 8 9 10
  ..$ aux: num [1:10] 0.86 0.86 0.86 0.86 0.86 ...
 $ :'data.frame':       10 obs. of  2 variables:
  ..$ Dag: int [1:10] 1 2 3 4 5 6 7 8 9 10
  ..$ aux: num [1:10] 0.874 0.874 0.874 0.874 0.874 ...