2015-02-23 33 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) 
相关问题