如何计算R中给定间隔的观测数量?

时间:2012-02-23 18:53:35

标签: r

我的数据包括每个观察的小时,分​​钟和秒的变量。我想在凌晨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 27 39 40 10 14 16 21 23

3 个答案:

答案 0 :(得分:7)

一种方法是根据您的分箱标准创建一个新变量,然后将该变量制成表格:

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

根据您需要的bin数量,您可能会遇到嵌套ifelse()语句的问题,但这应该会给您一个开始。如果您遇到问题,请更新您的问题并提供更多详细信息。

答案 1 :(得分:3)

length(which(data$hour <=2 ))怎么样?我在这里使用了2点,以避免在第一时间处理分钟和秒钟。然后在您想要计算的所有不同时间循环或apply

如果您需要每天重新开始计算,请同样使用数据$ day值。

答案 2 :(得分:2)

如果您决定需要不同的时间,这种方法可以提供更大的灵活性。您可以在任何时间点(不仅仅是几小时)找到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)