我正在扩大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
}
}
}
有什么建议吗?我希望能够创建一个功能,我可以在其中更改各种参数并保持灵活性。
对我应该拥有的推理的任何评论都非常感谢。 感谢您的任何意见。
玩得开心
答案 0 :(得分:0)
我发布了一个解决方案。
此类问题的诀窍是找到唯一标识符,在我的情况下合并列example$behavior
和example$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)
现在我将尝试编写一个函数以进行推广。 欢迎任何改进或加快答案的建议。
玩得开心