将data.frame与其中的列表转换为数字向量

时间:2015-02-23 11:44:30

标签: r list dataframe rbind

数据是一个包含3199行和30列的data.frame。我有来自不同位置的不同情节和具有许多变量的特定年份的年度数据。 我现在想要按位置和年份计算特定变量的平均值。数据是什么样的:

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-package中的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))))) 

但由于列的长度不同,这不起作用。我认为解决方案并不复杂,但我现在无法解决这个问题。

1 个答案:

答案 0 :(得分:0)

我终于做到了,我认为方式有点复杂,但它对我有用:

我首先在 plyr 包的帮助下按地点和年份拆分数据。

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

之后我想在一个专栏中每年在data.frame中拥有资源。所以按位置拆分。

a<-split(a, a$location)

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

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

    })


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