2014-02-20 52 views
0

我正在分析某些物質隨時間的退化。腳本的目標是在應用程序之後的某個時間(「Dag」變量)獲取包含觀察值變化的列表。使用for-loop和lapply分配循環輸出到列表

下面的腳本輸出是一個包含NULL值的列表。我認爲問題在於我將變量aux1分配給列表項,但當我通過命令行執行時,該行可以工作。

可能有更快的計算方法;即使在2個月後,我仍然感到不知所措。R

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

1)爲什麼要使用'<< - '? 2)爲什麼你的代碼中沒有空格? 3)'names(times1 < - 「Dag」)'應該是'names(times1)< - 「Dag」'4),否'<< - '5)'aux1 < - cbind(times,aux)'是使用單個命名值(aux)列綁定數據幀(times1);當使用cbind時,對象必須具有相同的行數。解決這些問題,並且至少應該運行 – rawr

+0

代碼問題的道歉。發佈前我沒有運行過仿真代碼。 – Pinemangoes

+0

你爲什麼不跑它?你只是認爲它不會工作? – rawr

回答

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 ... 
+0

非常感謝!每當我認爲我有了它的語法的竅門,它又踢我的屁股。 – Pinemangoes

+0

@Pinemangoes隨着時間的推移它會變得更容易。只要繼續努力吧。 – Thomas