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 多行数据,创建一个懒散 (l) 次向量,然后我可以使用它来计算平均值、sd 等。

关于如何做到这一点的任何提示?

4

2 回答 2

3

我们称这些数据为“loafers”。如果这不是“由鸟”完成的,您将丢弃第一行和最后一行,因为无法确定它们的前任和继任者并执行以下操作:

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 循环的一些技巧)并提出了这个问题。这个向量比原始数据集少一个观察值,但是在添加一个 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,因为该行没有被评估,但问题的性质不能是休息时间。最后一行将新向量“resting”附加到原始数据库中。

于 2013-03-28T21:43:44.247 回答