2013-03-27 107 views
3

我正在分析有關鳥類行爲的數據,並且希望計算海鳥在水面上停留的時間量,而不是在覓食潛水水追求魚)。數據目前以這種形式出現。根據周圍的行值對數據框進行子集

structure(list(alt_id = c(10L, 10L, 12L, 12L, 12L, 12L, 13L, 
13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 2L, 2L, 2L, 2L), 
    act = c("l", "d", "l", "d", "l", "d", "l", "d", "l", "d", 
    "l", "d", "l", "d", "l", "d", "l", "d", "l", "d"), action_time = c("15", 
    "0", "5", "24", "10", "0", "43", "28", "16", "37", "9", "35", 
    "15", "34", "11", "0", "12", "33", "15", "33")), .Names = c("alt_id", 
"act", "action_time"), row.names = c(NA, 20L), class = "data.frame") 

該數據子集包含4個不同個體(由獨特的id號索引)的行爲信息。我需要首先評估數據框,以便我只考慮個體鳥類的行爲。要做到這一點,我需要確保我正在考慮的行的正下方的id號是相同的。然後,我需要隔離鳥類在徘徊時的時間(由數據庫中的「l」表示)。然後,我想確保它在徘徊期前後都有鴿子(用「d」表示)。通過這樣做,我可以確保我不會指望這隻鳥在浮潛之間愉快地漂浮在水面上的時候,因爲它們可能會在浮潛之後幾個小時這樣做。

理想情況下,這將運行在for循環或其他表達式中,允許我一次運行所有4,000多行數據,創建一個loafing(l)次向量,然後可以使用它計算mean,sd等。 上。

有關如何完成此任務的任何提示?

+1

你的樣本數據的結果是什麼? – 2013-03-27 18:13:51

+0

具體而言,鳥#10的數據將被排除,對吧? ...第3行不會被添加到總數中,因爲在第一個閒蕩期之前沒有潛水,對吧? – 2013-03-27 18:20:33

+0

樣本數據的結果將是一個只包含action_time的向量,該action_time是「l」並且在任一側由「d」限定(同一個鳥ID。 – marcellt 2013-03-27 18:35:41

回答

3

我們稱之爲「懶漢」。如果這不是做「的鳥」,你會扔出去的第一和最後一個行,因爲他們的前任和繼任者不能確定,做到這一點:

dtest <- function(dfrm) dfrm[c(FALSE, 
           dfrm$act [2:(nrow(dfrm)-1)] =="l" & 
           dfrm[ 1:(nrow(dfrm)-2), "act"] =="d" & 
           dfrm[ 3:(nrow(dfrm)), "act"] =="d" , 
           FALSE) , ] 

應用到完整數據,並再次拋出鳥內的第一和最後一行:

lapply(split(loafers, loafers$alt_id), dtest) 
$`2` 
    alt_id act action_time 
19  2 l   15 

$`10` 
[1] alt_id  act   action_time 
<0 rows> (or 0-length row.names) 

$`12` 
    alt_id act action_time 
5  12 l   10 

$`13` 
    alt_id act action_time 
9  13 l   16 
11  13 l   9 
13  13 l   15 
15  13 l   11 
+0

感謝您的幫助,DWin完美解決了這個問題。 – marcellt 2013-03-28 20:46:32

2

雖然迪文回答我問我延續了下來,我不得不回答了之前的路徑(用怎樣提出for循環的一些技巧)的問題,並想出了這個。這個向量比原始數據集少一個觀測值,但是在添加一個FALSE之後,它可以被附加並用於子集,因爲這只是較大問題的一小部分。較大的數據幀我正在與工作被稱爲「陸地」

rest <- function(x) 
{ 
    output <- vector(length=NROW(x$alt_id)-1) 
    for(i in 2:(length(x$alt_id)-1)) 
    { 
    if(x$alt_id[i]==x$alt_id[i+1] && 
    x$alt_id[i]==x$alt_id[i-1] && 
    x$act[i]=="l" && 
    x$act[i+1]=="d" && 
    x$act[i-1]=="d") 
     { 
     output[i] <- "TRUE" 
     } 
     else 
     { 
     output[i] <- "FALSE" 
     } 
    } 
    return(output) 
} 

resting <- rest(land) 
resting <- append(resting,"FALSE") 
land <- cbind(resting, land) 

第二到代碼的行甫一添加一個更FALSE到的矢量作爲該行沒有評價,但對這個問題的性質不能是一個靜止時間。最後一行將新的矢量「休息」添加到原始數據庫中。

相關問題