将其中包含列表的 data.frame 转换为数值向量

Convert data.frame with lists in it to nummerical vectors

数据是一个 data.frame,有 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)}))

我需要使用 plyr 包中的 rbind.fill,因为结果的长度不同。我得到的是一个 data.frame 里面有列表。看起来像:

    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。我想保留 data.frame 的格式,其中 NULL 应该是 NA。我试过:

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

但这行不通,因为列的长度不同。我认为解决方案应该不会太复杂,但我现在想不出来..

我终于做到了,我觉得方法有点复杂,但对我有用:

我首先借助 plyr 包按位置和年份拆分数据。

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

之后,我希望每年在一个专栏中有一个 data.frame 的方法。所以按位置拆分。

a<-split(a, a$location)

我使用 zoo 包 制作时间序列对象,然后将它们放入 data.frame。

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

    })


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