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 以上のデータ行すべてを一度に実行して、平均、sd などの計算に使用できるローフィング (l) 回のベクトルを作成できます。

これを達成するためのヒントはありますか?

4

2 に答える 2

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) , ]

完全なデータに適用し、bird 内の最初と最後の行を再度破棄します。

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
于 2013-03-27T19:48:40.417 に答える
2

DWin は私が尋ねた質問に答えましたが、私は答えの前にたどった道を進み (for ループを構成する方法のヒントをいくつか)、これを思い付きました。このベクトルは、元のデータ セットよりも観測値が 1 つ少ないですが、FALSE をもう 1 つ追加した後、これを追加してサブセット化するために使用できます。これは、より大きな問題のほんの一部にすぎないためです。私が扱っているより大きなデータフレームは「土地」と呼ばれます

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)

コードの 2 行目は、この行が評価されていないため、ベクターに FALSE をもう 1 つ追加するだけですが、質問の性質上、休憩時間にすることはできません。最後の行は、元のデータベースに新しいベクトル 'resting' を追加します。

于 2013-03-28T21:43:44.247 に答える