# [R] binned tabulation

Tue Apr 10 02:38:47 CEST 2012

```Hello,

>
> Delia,
>
> name <- data.frame(Behavior=c(1, 2, 1, 2, 1), Time=c(0, 40, 45, 55, 57))
>
> appear <- name\$Time[name\$Behavior==1]
> disappear <- name\$Time[name\$Behavior==2]
> if(length(appear) > length(disappear)) disappear <- c(disappear, 60)
> sum(disappear - appear)
>
> Delia Shelton wrote on 04/09/2012 12:30:23 PM:
>
>> Hi,
>>
>> I am attempting to tabulate binned data. The '1' represents the
>> appearance of the focal mouse pup, and '2' represents the
>> disappearance of the focal mouse pup. The code written below is
>> intended to calculate the total time spent appeared out of 3600s.
>> For Sample 1, both the hand calculation and R code yield the same
>> result, 50. A problem seems to occur when '1' is the last entry. For
>> Sample 2, the total time appeared is 53  (hand calculation),
>> however, using the R code below yields 55. If you have any
>> suggestions for solving the problem, please let me know.
>>
>> Thank you in advance for any assistance you may provide.
>>
>> Delia
>>
>>
>> Sample 1
>>
>> 0.0 1
>> 40 2
>> 45 1
>> 55 2
>>
>>
>> Sample 2
>>
>> 0.0 1
>> 40 2
>> 45 1
>> 55 2
>> 57 1
>>
>>
>>
>> colnames(name)<-c("Time", "Behavior")
>> name = data.frame(name\$Behavior, name\$Time)
>> colnames(name)<-c("Behavior", "Time")
>> name<-name[name\$Time < 3600, ];
>>
>> ## run file
>>
>> x<-seq(0,3600, by = 60) # total time partition by time which is 60
>>
>> if (tail(name\$Behavior, 1) == 1) {name<-rbind(name, c(4, 3600))} else
>> {name<-rbind(name, c(1, 3600))}
>>
>> if (nrow(name) %% 2 != 0)
>>  {name <-name[-c(nrow(name)), -c(nrow(name))]}
>>
>> q<-NULL
>> for (y in (1: nrow(name)))
>> {
>>     if (y %% 2 != 0)
>>     q<-c(q, (c(name\$Time[y]:name\$Time[y +1])))
>> }
>>
>> b<-table(cut(q,x))
>>
>> sum(b)
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help@ mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

Or use a logical index into the data.frame's rows.

fun.count <- function(x, increment=60){
if (x\$Behavior[nrow(x)] == 1)
x <- rbind(x, c(4, increment*ceiling(x\$Time[nrow(x)] / increment)))
inx <- x\$Behavior == 1
sum(x\$Time[!inx] - x\$Time[inx])
}

fun.count(name)

Hope this helps,