Как мне подсчитать количество наблюдений с заданными интервалами в R? - PullRequest
5 голосов
/ 23 февраля 2012

У меня есть данные, которые включают переменные для часа, минуты и секунды для каждого наблюдения.Я хочу посчитать количество наблюдений до 3 часов утра, все наблюдения до 6 часов утра, все наблюдения до 9 часов утра и так далее.Буду очень признателен за любую помощь в этом.

Пример данных:

day    hour    minute   second
01       17        10       03
01       17        14       20
01       17        25       27
01       17        32       39
01       17        33       40
01       17        34       10
01       17        34       14
01       17        34       16
01       17        34       21
01       17        34       23
01       17        34       25
01       17        34       31
01       17        34       36

У меня около 300 000 таких наблюдений.

час: int 17 17 17 17 17 17 17 17 17 17

минута: int 10 14 25 32 33 34 34 34 34 34

секунда: int 3 20 2739 40 10 14 16 21 23

Ответы [ 3 ]

7 голосов
/ 23 февраля 2012

Один из подходов состоит в том, чтобы создать новую переменную на основе ваших критериев биннинга, а затем создать таблицу для этой переменной:

set.seed(1)
dat <- data.frame(hour = sample(0:23, 100, TRUE, prob = runif(24)),
                  minute = sample(0:59,100, TRUE, prob = runif(60)),
                  second = sample(0:59,100, TRUE, prob = runif(60)))

#Adjust bins accordingly
dat <- transform(dat, bin = ifelse(hour < 3,"Before 3",
                                   ifelse(hour < 6,"Before 6",
                                          ifelse(hour <9,"Before 9","Later in day"))))

as.data.frame(table(dat$bin))
          Var1 Freq
1     Before 3    7
2     Before 6   17
3     Before 9   19
4 Later in day   57

В зависимости от нужного вам количества бинов вы можете столкнуться с проблемами с вложенными операторами ifelse (), но это должно дать вам начало. Если вы застряли, обновите свой вопрос, добавив больше деталей.

3 голосов
/ 24 февраля 2012

Как насчет length(which(data$hour <=2 ))? Я использовал 2 часа здесь, чтобы не иметь дело с минутами и секундами. Затем выполните цикл или apply по всем различным часам, которые вы хотите посчитать.

Если вам нужно перезапускать счет каждый день, то используйте значение данных $ day аналогичным образом.

2 голосов
/ 24 февраля 2012

Этот подход дает вам больше гибкости, если вы решите, что вам нужно разное время.Вы можете найти ниже любой момент времени (не только часы).Поскольку я ленив, я сделал эту работу, рассматривая все как персонажей.

#1.  Create a fake data set as chase did
set.seed(1)
dat <- data.frame(hour = sample(0:23, 100, TRUE, prob = runif(24)),
                  minute = sample(0:59,100, TRUE, prob = runif(60)),
                  second = sample(0:59,100, TRUE, prob = runif(60)))

#2.  Create a function to turn your single digits double and everything into character 
dig <- function(x){ 
    ifelse(nchar(as.character(x))<2, paste("0", as.character(x), sep=""),
        as.character(x))
}

#3.  Use the dig function to make a character dataframe    
dat <- data.frame(sapply(dat, dig))

#4.  Paste hour minute and second together into new character vector
dat <- transform(dat, time=as.numeric(paste(hour, minute, second,sep="")))

#5.  function to take that character vector and compare it to the cut off time    
n.obs <- function(var, hour='0', min='00', sec='00', pm=FALSE){
    hour <- if(pm) as.character(as.numeric(hour) + 12) else hour
    bench <- as.numeric(paste(hour, min, sec, sep=""))
    length(var[var<=bench])
}

#try it out
n.obs(dat$time, '2')
n.obs(dat$time, '2', pm=T)
n.obs(dat$time, '14', pm=F)  #notice same as above because pm=F
n.obs(dat$time, hour='14', min='30', pm=F)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...