2012-02-23 4 views
4

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

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

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 27 39 40 10 14 16 21 23

+0

Привет, я предложил, чтобы этот вопрос был перенесен в Stack Overflow. Независимо от того, где он сидит, не могли бы вы предоставить некоторые из ваших значений данных в своем вопросе, а также вывод 'str()' на ваши данные, в частности, для переменной времени. – Michelle

+0

Если мое редактирование на ваш вопрос будет принято, вы увидите, что ваши данные изложены в столбцах вашего вопроса, я надеюсь, что все в порядке - я изложил это для ясности. – Michelle

+0

это способ лучше! Спасибо большое. Вы использовали уценку, чтобы сделать это? –

ответ

6

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

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

Обратите внимание, что 'cut()' часто используется для упражнения binning, которое я только что прошел выше. Это будет мое следующее место, чтобы остановиться. – Chase

+0

Chase, Это было действительно полезно.Очень ценю, что ты отвечаешь на мой вопрос! – HFC

+0

Cut будет моим первым выбором: он просто чувствует себя легче: 'table (cut (dat $ hour, seq (0,24,3)))' –

3

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

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

+0

Carl, спасибо, что ответил на мой вопрос. Как noob, это был первый подход, который я использовал, чтобы убедиться, что могу получить нужные данные. Затем я пошел и использовал метод, который Чейз преподавал, поэтому было полезно узнать больше трюков! Спасибо. – HFC

1

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

#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) 
Смежные вопросы