r中的三重条件选择数据

时间:2015-03-04 10:45:58

标签: r selection conditional-statements

我正在扩大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)

我想总结示例$ behavior ==&#34; 1&#34;在示例$ behavior ==&#34; close&#34;的每个间隔期间。间隔由列示例$ event_type by&#34; start&#34;定义。并且&#34;停止&#34;。

建议的解决方案是:

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')之间的任何事件,也是名为&#34; 2&#34;的示例$行为,以及命名&#34;对&#34;,旁边我真正想要的:示例$ behavior ==&#34; 1&#34;

基本上我希望能够选择我的数量,但我找不到方法。 输出为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   
        }   
    }
}

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

对我应该拥有的推理的任何评论都非常感谢。 感谢您的任何意见。

玩得开心

1 个答案:

答案 0 :(得分:0)

我发布了一个解决方案。

此类问题的诀窍是找到唯一标识符,在我的情况下合并列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)

现在我将尝试编写一个函数以进行推广。 欢迎任何改进或加快答案的建议。

玩得开心