2015-02-23 59 views
0

數據是具有3199行和30列的數據幀。我有來自不同地點的不同地塊和具有多個變量的特定年份的年度數據。 我現在想根據地點和年份計算特定變量的平均值。數據看起來如下:將數據幀與其中的列表一起轉換爲數字向量

year location variable1 variable2 ... 
1923 1013  
1924 1013 
1925 1013 
.  . 
.  . 
1930 1014 

所以我首先按年份和位置分割數據。現在我想計算平均值。這就是下面的代碼呢:

data<-lapply(data, function(x){lapply(x,function(y) 
{m<-sum(variable1)/length(y$variable1) 
calculatedmean<-rbind(calculatedmean,m)})}) 

之後,我希望能有結果返回到一個data.frame,那是什麼下面的代碼應該做的:

calculatedmean<-rbind.fill(lapply(calculatedmean,function(x) 
{as.data.frame(t(x),stringsAsFactors=FALSE)})) 

我需要rbind.fill使用來自plyr-package,因爲結果長度不同。我得到的是一個包含列表的數據框。它看起來像:

colname1      colname2      colname3 ... 
    list(x0.00029 = 0.00029)  NULL       NULL 
    list(X0.000313 = 0.000313) NULL       NULL 
    list(X0.000272 = 0.000272) list(X0.000625 = 0.000625) NULL 
     .       .        . 
     .       .        . 

我想用數據[1,1]的計算均值來替換列表元素,例如它是0.00029。我想保留NULL應該是NA的data.frame的格式。我試過它:

t(as.data.frame(sapply(caluculatedmean,function(x) unname(unlist(x))))) 

但是,這是行不通的,因爲列的不同長度。我認爲解決方案並不複雜,但我現在無法弄清楚。

+0

如果您將在此處發佈可複製的例子與您的數據,這將有很大幫助。你的任務對於'ddply'看起來很不錯,而不是用'lapply'工作。如果您發佈數據,這將有助於您提供可重複的答案。 – 2015-02-23 11:52:22

+0

我用ddply得到了兩個結果:'意味着<-ddply(data,c(「location」,「year」),summary,mean = mean(variable1,na.rm = TRUE))''但是我現在有一個非常類似的問題:手段存儲在一列中,但我想讓他們按位置拆分成不同的列。由於它們的長度不同,我試圖使用cbind.fill,但這不起作用。 (注意:我編輯了這個問題並給出了一些數據的例子,希望有所幫助) – dementation 2015-02-23 14:59:50

回答

0

我終於做到了,我覺得方式有點複雜,但它對我有效:

我首先按照位置和年份,在包的幫助下分割了數據。

means<-ddply(data, c("location", "year"),summarise, mean = mean(variable1, na.rm=TRUE)) 

之後,我希望在每一年的data.frame在一個列中的手段。因此按位置分割。

a<-split(a, a$location) 

我用動物園包進行時間序列的對象,然後將它們放到一個data.frame。

a<-lapply(a, function(x){ 
    assign(paste(x$location[1]),zoo(x$mean, x$year)) 

    }) 


    a<-do.call("merge", a)