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$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)
现在我会尝试写一个函数来泛化。
欢迎任何改进或加快答案的建议。
玩得开心
我正在扩展 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$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)
现在我会尝试写一个函数来泛化。 欢迎任何改进或加快答案的建议。
玩得开心