2016-05-23 32 views
0

我有物種到食物的到達時間的數據。我希望能夠通過使用到達時間的got.here值來確定在每個屠體的breed_jackalsbreed_hyena水平之前發生的breed的水平。如何找到在另一個指定級別之前發生的因素的級別?

我只想要在第一種情況下的訂單carcass_336 我會得到一個值爲jack,這將是breed_eagles

對於第二個屠體carcass_338我會有2級的鬣狗breed_lappetsbreed_eagles按此順序。並且因爲鬣狗在它之前到達,所以3級爲jack狼狗,即breed_lappets,breed_eagles & breed_hyena

我以爲arrivals$breed[arrivals$mycarcass=="carcass_336"]會工作,但它給了我所有的水平。

理想情況下,我還想通過使用每個最低got.here來挑出哪一級發生在jack狼和鬣狗之前。例如。對於carcass_338,它將是的breed_hyenas。同樣,因爲我們使用的是提取每個屍體最短的到達時間與另一個目的got.here值將是我覺得有用:

arrivals[ arrivals$got.here == ave(arrivals$got.here, arrivals$mycarcass, FUN=min), ] 

這裏是我的數據:

arrivals <- read.table(header=T, text=" 
who  breed   got.here mycarcass 
167  breed_eagles 102  carcass_336 
183  breed_eagles 108  carcass_336 
181  breed_eagles 271  carcass_336 
134  breed_eagles 284  carcass_336 
191  breed_eagles 311  carcass_336 
283  breed_jackals 5419  carcass_336 
118  breed_lappets 200  carcass_338 
198  breed_eagles 219  carcass_338 
151  breed_eagles 256  carcass_338 
206  breed_hyenas 1759  carcass_338 
294  breed_jackals 7948  carcass_338 
235  breed_hyenas 10988  carcass_338 
215  breed_hyenas 13629  carcass_338 
290  breed_jackals 17013  carcass_338") 

的我想從中得出預期的輸出結果,並且將是這些事件的頻率。例如爲jack狗

preceeding_breed frequency 
breed_eagles   1 
breed_lappets  0 
breed_hyenas   1 
+0

您能否展示預期的產量? – mtoto

+0

@moto這些事件發生頻率的一些總結將是理想的,因爲我沒有在我的答案中說明。 –

回答

1

這是一種方法來計算物種到達之前jack到達。可能有一個更清潔的方法。爲了清楚起見,我只是要展示jack狼犬的解決方案,但獲得鬣狗的結果將是直截了當的。

# for each carcass, calculate the first jackal arrival 
first_jackals <- aggregate(got.here~mycarcass, 
          data=arrivals[arrivals$breed=="breed_jackals",], FUN=min) 

# tabulate the number of other animals arriving before the jackal 
beat_jackals <- sapply(unique(arrivals$mycarcass), function(i) { 
     table(arrivals$breed[arrivals$mycarcass==i & 
       arrivals$got.here < first_jackals$got.here[first_jackals$mycarcass==i]])}) 

這將返回一個矩陣,其中包括鬣狗和Jack狼在內的每個品種的計數。現在,我們放棄從計數鬣狗和豺狼和屍體名稱添加到列:

# drop unwanted breeds 
beat_jackals <- 
      beat_jackals[row.names(beatJackals) != "breed_jackals",] 
# add carcass names to the columns 
colnames(beat_jackals) <- unique(arrivals$mycarcass) 

因爲sapply處理的屍體以相同的順序,unique(arrivals$mycarcass),我們不必擔心錯位。

要通過品種獲得到達的順序給每個屍體,你可以使用以下命令:

arrival_order <- sapply(unique(arrivals$mycarcass), function(i) { 
            unique(arrivals[arrivals$mycarcass==i, "breed"])}) 

這將讓你拉出來的是到達之前立即豺狗的品種:

sapply(arrival_order, function(i) i[(which(i=="breed_jackals"))-1]) 
+0

夢幻般的答案。非常感謝。有一點是,屠體名稱不能正確重新分配。雖然對我來說不是一個問題。 –

+0

@ManassaMauler如果此答案適合您,請點擊旁邊的複選標記進行選擇。如果你有一個相關的問題,你可以發佈它,當我有機會時我很樂意看看。 – lmo

相關問題