2012-12-17 30 views
0

我想使用數據框中的參考列創建4小時的間隔。我有這樣一個數據幀:使用R中的參考列創建4小時時間間隔

species<-"ABC" 
ind<-rep(1:4,each=24) 
hour<-rep(seq(0,23,by=1),4) 
depth<-runif(length(ind),1,50) 

df<-data.frame(cbind(species,ind,hour,depth)) 
df$depth<-as.numeric(df$depth) 

我想什麼是創建一個新的列(不改變的信息或原始數據幀的尺寸),可以看看我的時間列(參考欄),並根據該值給我一個4小時的時間間隔。例如,如果小時列的值介於0和3之間,則新列中的值將爲0;如果值介於4和7之間,則新列中的值將爲4,依此類推...在excel中,我曾使用floor/ceiling函數進行此操作,但在R中它們不完全相同。此外,如果有人使用原始日期/時間數據也可以起作用,那麼這個建議就更簡單了。在我原來的腳本中,我使用函數as.POSIXct來獲取日期/時間數據,並從那裏獲得我的小時數列。

我感謝您的幫助,

+1

我想你應該看'cut',特別是'cut.Date'。 – A5C1D2H2I1M1N2O1R2T1

回答

2

怎麼樣考慮的時間列,將其轉換爲整數,並使用整數除法來獲得在地板上?像這樣

# convert hour to integer (hour is currently a col of factors) 
i <- as.numeric(levels(df$hour))[df$hour] 

# make new column 
df$interval <- (i %/% 4) * 4 
+0

@ aleph_null根據這個相同的例子,你將如何找到6到17之間的時間間隔(seq(6,17,1)),並在另一列中將其命名爲「daytimes」?夜間也一樣,這將是不是白天的剩餘時間? – user1626688

1

尖端數字1,不要用cbind創建具有不同列類型data.frame,一切都被強制轉換爲同一類型(在這種情況下因子)

findIntervalcut在這裏似乎很合適。

df <- data.frame(species,ind,hour,depth) 
# copy 
df2 <- df 
df2$fourhour <- c(0,4,8,12,16,20)[findInterval(df$hour, c(0,4,8,12,16,20))] 
1

儘管可能有一個更簡單的方法,但這裏是一個嘗試。

使不使用cbind首先你data.frame雖然,所以hour不是factornumeric

df <- data.frame(species,ind,hour,depth) 

然後:

df$interval <- factor(findInterval(df$hour,seq(0,23,4)),labels=seq(0,23,4)) 

結果:

> head(df) 
    species ind hour depth interval 
1  ABC 1 0 23.11215  0 
2  ABC 1 1 10.63896  0 
3  ABC 1 2 18.67615  0 
4  ABC 1 3 28.01860  0 
5  ABC 1 4 38.25594  4 
6  ABC 1 5 30.51363  4 

你可以也使標籤更好一些:

cutseq <- seq(0,23,4) 
df$interval <- factor(
         findInterval(df$hour,cutseq), 
         labels=paste(cutseq,cutseq+3,sep="-") 
        ) 

結果:

> head(df) 
    species ind hour depth interval 
1  ABC 1 0 23.11215  0-3 
2  ABC 1 1 10.63896  0-3 
3  ABC 1 2 18.67615  0-3 
4  ABC 1 3 28.01860  0-3 
5  ABC 1 4 38.25594  4-7 
6  ABC 1 5 30.51363  4-7 
+0

基於同樣的例子,你會如何找到6到17之間的時間間隔(seq(6,17,1)),並在另一列中將其命名爲「daytimes」?夜間也一樣,這將是不是白天的剩餘時間? – user1626688

2

擴大對我的評論,因爲我認爲你最終尋找一些點實際日期...

一些樣品每小時數據:

set.seed(1) 
mydata <- data.frame(species = "ABC", 
        ind = rep(1:4, each=24), 
        depth = runif(96, 1, 50), 
        datetime = seq(ISOdate(2000, 1, 1, 0, 0, 0), 
            by = "1 hour", length.out = 96)) 
list(head(mydata), tail(mydata)) 
# [[1]] 
# species ind depth   datetime 
# 1  ABC 1 14.00992 2000-01-01 00:00:00 
# 2  ABC 1 19.23407 2000-01-01 01:00:00 
# 3  ABC 1 29.06981 2000-01-01 02:00:00 
# 4  ABC 1 45.50218 2000-01-01 03:00:00 
# 5  ABC 1 10.88241 2000-01-01 04:00:00 
# 6  ABC 1 45.02109 2000-01-01 05:00:00 
# 
# [[2]] 
# species ind  depth   datetime 
# 91  ABC 4 12.741841 2000-01-04 18:00:00 
# 92  ABC 4 3.887784 2000-01-04 19:00:00 
# 93  ABC 4 32.472125 2000-01-04 20:00:00 
# 94  ABC 4 43.937191 2000-01-04 21:00:00 
# 95  ABC 4 39.166819 2000-01-04 22:00:00 
# 96  ABC 4 40.068132 2000-01-04 23:00:00 

改變着數據使用cutformat

mydata <- within(mydata, { 
    hourclass <- cut(datetime, "4 hours")    # Find the intervals 
    hourfloor <- format(as.POSIXlt(hourclass), "%H") # Display just the "hour" 
}) 
list(head(mydata), tail(mydata)) 
# [[1]] 
# species ind depth   datetime   hourclass hourfloor 
# 1  ABC 1 14.00992 2000-01-01 00:00:00 2000-01-01 00:00:00  00 
# 2  ABC 1 19.23407 2000-01-01 01:00:00 2000-01-01 00:00:00  00 
# 3  ABC 1 29.06981 2000-01-01 02:00:00 2000-01-01 00:00:00  00 
# 4  ABC 1 45.50218 2000-01-01 03:00:00 2000-01-01 00:00:00  00 
# 5  ABC 1 10.88241 2000-01-01 04:00:00 2000-01-01 04:00:00  04 
# 6  ABC 1 45.02109 2000-01-01 05:00:00 2000-01-01 04:00:00  04 
# 
# [[2]] 
# species ind  depth   datetime   hourclass hourfloor 
# 91  ABC 4 12.741841 2000-01-04 18:00:00 2000-01-04 16:00:00  16 
# 92  ABC 4 3.887784 2000-01-04 19:00:00 2000-01-04 16:00:00  16 
# 93  ABC 4 32.472125 2000-01-04 20:00:00 2000-01-04 20:00:00  20 
# 94  ABC 4 43.937191 2000-01-04 21:00:00 2000-01-04 20:00:00  20 
# 95  ABC 4 39.166819 2000-01-04 22:00:00 2000-01-04 20:00:00  20 
# 96  ABC 4 40.068132 2000-01-04 23:00:00 2000-01-04 20:00:00  20 

請注意,您的新「小時課」變量是一個因素,新的「小時地點」變量是字符,但您可以輕鬆更改這些變量,即使在within階段也是如此。

str(mydata) 
# 'data.frame': 96 obs. of 6 variables: 
# $ species : Factor w/ 1 level "ABC": 1 1 1 1 1 1 1 1 1 1 ... 
# $ ind  : int 1 1 1 1 1 1 1 1 1 1 ... 
# $ depth : num 14 19.2 29.1 45.5 10.9 ... 
# $ datetime : POSIXct, format: "2000-01-01 00:00:00" "2000-01-01 01:00:00" ... 
# $ hourclass: Factor w/ 24 levels "2000-01-01 00:00:00",..: 1 1 1 1 2 2 2 2 3 3 ... 
# $ hourfloor: chr "00" "00" "00" "00" ...