2014-02-24 162 views
1

總,我有以下數據重新排列和r中

> 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 

這幾乎是我所期待的,但有沒有更好的方式來做到這一點,應該如何我處理數據中的零?

回答

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 

在你的榜樣,有網站和樣品之間有一個一一對應。這種方法適用於每個成對的不同組合。至於

我該如何處理數據中的零?

你想如何處理它們?你有什麼擔憂?

+0

,是完美謝謝你的回答。我喜歡這個,但似乎不能,因爲這是我的第一個問題。 – user3348711

+0

以前,當我試圖總結「y」時,我得到的總數包括零,但這種方法是我正在尋找的。 – user3348711

+0

@ user3348711您將可以立即開始註冊。請查看其他答案,如果您滿意,請點擊旁邊的複選標記將其標記爲「已接受」。這樣人們會知道你還沒有等待更多的答案。 – Gregor

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