r中数据的三重条件选择

Triple Conditioned selection of data in r

我正在扩展 5 个月前提出的问题:
Double Conditioned selection of data in r

我现在需要添加一个条件,但我无法在建议的解决方案上执行。 显然我的编码技能没有太大提高:/

可重现的例子:

time.stamp <- c(1:22)
behavior <- c("close", "1","2","1","1", "close","1","1","close","close","distance","1","distance","close", "1","right","2","1","2","right","1", "close")
event_type <- c("start","point","point","point","point","stop","point","point","start","stop", "start","point","stop","start","point","start","point","point","point","stop","point","stop")


example <- data.frame(time.stamp,behavior,event_type)

我想在 example$behavior=="close" 的每个时间间隔内对 example$behavior=="1" 的数量求和。间隔由列 example$event_type 由 "start" 和 "stop".

定义

建议的解决方案是:

sum((which( example$behavior == 'close' & as.character(example$event_type) == 'stop') - which( example$behavior == 'close' & as.character(example$event_type) == 'start')) - 1)

然而,通过这种方法,我计算了开始 (example$event_type == 'start') 和结束 (example$event_type == 'stop') 之间的任何事件,还有名为“2”的示例$行为,以及名为 "right",除了我真正想要的:example$behavior== "1"

基本上我希望能够select我算的但是我没有找到方法。 输出为 11,修正后为 6!

这是我尝试过的:

sum(which( example$behavior[(which( example$behavior == 'close' & as.character(example$event_type) == 'stop') - which( example$behavior == 'close' & as.character(example$event_type) == 'start')) - 1]== "1"))

或:

count<-0
for(i in 1:length(example$behavior)){
    if(example$behavior[i]=="close"){
        while (i>= example$event_type%in% "start" && i<=example$event_type%in% "stop"){
            count=count+1   
        }   
    }
}

有什么建议吗?它希望能够创建一个函数,我可以在其中更改各种参数并保持灵活性。

非常感谢对我应该有的推理的任何评论。 感谢您的任何输入。

玩得开心

我post一个解决方案。

解决这类问题的诀窍是找到一个唯一标识符,在我的例子中合并列example$behaviorexample$event_type将提供唯一的案例,剩下的就是子集和循环的问题。 问题中给出了可重现的例子。

example$beh_eve <- paste(example$behavior,"_",example$event_type,sep="")
start<-which( example$beh_eve == 'close_start')
end<-which( example$beh_eve == 'close_stop') 

sum_1<-0
for(i in 1:length(start)){
    xx <-example[start[i]:end[i],]
    s<-sum(xx$behavior=="1",na.rm=TRUE)
    sum_1<-sum_1+s
}
print(sum_1)

现在我会尝试写一个函数来泛化。 欢迎任何改进或加快答案的建议。

玩得开心