在r中重新排列和聚合

时间:2014-02-24 22:20:47

标签: r aggregate

我有以下数据

> site<-c("A","A","A","B","B","C")  
> sample<-c("N","N","N","W","W","S")  
> effort<-c(2,2,2,1,1,3)  
> y<-c(1,0,1,1,0,1)  
> df<-data.frame(site,sample,effort,y)  
> df  
  site sample effort y  
1    A      N      2 1  
2    A      N      2 0  
3    A      N      2 1
4    B      W      1 1
5    B      W      1 0
6    C      S      3 1

我想重新排列以获得最小的“努力”,并为每个样本和网站加上“y”。

最终得到以下内容

 site sample effort y
1    A      N      2 2
2    B      W      1 1
3    C      S      3 1

我尝试过以下代码

tr<-aggregate(.~site+sample,data=df, FUN=function(df) c(m=min(df), n=length(df)))
> tr
  site sample effort.m effort.n y.m y.n
1    A      N        2        3   0   3
2    C      S        3        1   1   1
3    B      W        1        2   0   2

这几乎是我正在寻找的,但有更好的方法来做到这一点,我应该如何处理数据中的零?

2 个答案:

答案 0 :(得分:2)

使用强大的dplyr

的答案
library(dplyr)

df %.%
    group_by(site,sample) %.%
    select(site, sample) %.%
    summarise (
        mineff = min(effort),
        y = sum(y))

  site sample mineff y
1    C      S      3 1
2    A      N      2 2
3    B      W      1 1

答案 1 :(得分:1)

使用plyr

 require(plyr)
 ddply(df, c("site", "sample"), summarize,
       min_eff = min(effort), sum_y = sum(y))

   site sample min_eff sum_y
1    A      N       2     2
2    B      W       1     1
3    C      S       3     1

在您的示例中,站点和示例之间存在一对一的对应关系。这种方法适用于每个成对的不同组合。至于

  

我应该如何处理数据中的零?

你想如何处理它们?你有什么顾虑?