2012-12-26 220 views
3

聖誕快樂拆分數據幀

我想拆分一個長的數據框。數據框看起來像這樣

x<-c('0:00:00', '0:30:00', '1:00:00', '1:30:00', '2:00:00', '2:30:00', '3:00:00', 
    '0:00:00', '0:30:00', '1:00:00', '1:30:00', '2:00:00', '2:30:00', '3:00:00', 
    '3:30:00', '4:00:00','0:00:00', '0:30:00', '1:00:00', '1:30:00', '2:00:00', 
    '2:30:00', '3:00:00', '0:00:00', '0:30:00', '1:00:00', '1:30:00', '2:00:00', 
    '2:30:00', '3:00:00' , '3:30:00', '4:00:00') 

    y=seq(1:32) 

    data1=data.frame(x,y) 

我想以這樣的方式來分割的輸出看起來像

0:00:00 1 8 17 24 
    0:30:00 2 9 18 25 
    1:00:00 3 10 19 26 
    1:30:00 4 11 20 27 
    2:00:00 5 12 21 28 
    2:30:00 6 13 22 29 
    3:00:00 7 14 23 30 
    3:30:00 NA 15 NA 31 
    4:00:00 NA 16 NA 32 

,我考慮這樣做的任何想法或功能?我嘗試使用拆分功能,但無法完成。 非常感謝您的幫助和時間。

馬修的以下解決方案效果最好。但是如果我增加了週期時間X

x<-c('0:00:00', '0:30:00', '1:00:00', '1:30:00', '2:00:00', '2:30:00', '3:00:00', '3:30:00', 
    '4:00:00', '4:30:00', '5:00:00', '5:30:00', '6:00:00', '6:30:00', '7:00:00', 
    '7:30:00','8:00:00', '8:30:00', '9:00:00', '9:30:00', '10:00:00', '10:30:00', 
    '11:00:00','11:30:00','0:00:00', '0:30:00', '1:00:00', '1:30:00', '2:00:00', '2:30:00', 
    '3:00:00', '3:30:00', '4:00:00', '4:30:00', '5:00:00', '5:30:00', '6:00:00', '6:30:00', 
    '7:00:00', '7:30:00','8:00:00', '8:30:00', '9:00:00', '9:30:00', '10:00:00', '10:30:00', 
    '11:00:00','11:30:00', '12:00:00', '12:30:00', '13:00:00', '13:30:00') 

,並使用相同的代碼,我得到以下錯誤:

Error in match.names(clabs, names(xi)) : names do not match previous names 

乾杯, Swagath的

+0

您的'x'列不是幾天內連續發生的幾次?如果是這樣,你可能會更好地解析整個日期並處理它。 – A5C1D2H2I1M1N2O1R2T1

+0

日期時間的日期部分將是分裂的自然因素,比尋找時間迴歸更好。 –

回答

1

如果我們可以假設,每一個新的週期開始於0:00:00,並且每一個新的週期將始終包括0:00:00,那麼我們就可以很容易地創建一個「時間」使用cumsum()變量之後使用reshape()

data1 <- data.frame(
    x = c('0:00:00', '0:30:00', '1:00:00', '1:30:00', '2:00:00', '2:30:00', 
     '3:00:00', '0:00:00', '0:30:00', '1:00:00', '1:30:00', '2:00:00', 
     '2:30:00', '3:00:00', '3:30:00', '4:00:00','0:00:00', '0:30:00', 
     '1:00:00', '1:30:00', '2:00:00', '2:30:00', '3:00:00', '0:00:00', 
     '0:30:00', '1:00:00', '1:30:00', '2:00:00', '2:30:00', '3:00:00' , 
     '3:30:00', '4:00:00'), 
    y = seq(1:32)) 
data1$times <- cumsum(data1$x == "0:00:00") 
reshape(data1, direction = "wide", idvar = "x", timevar = "times") 
#   x y.1 y.2 y.3 y.4 
# 1 0:00:00 1 8 17 24 
# 2 0:30:00 2 9 18 25 
# 3 1:00:00 3 10 19 26 
# 4 1:30:00 4 11 20 27 
# 5 2:00:00 5 12 21 28 
# 6 2:30:00 6 13 22 29 
# 7 3:00:00 7 14 23 30 
# 15 3:30:00 NA 15 NA 31 
# 16 4:00:00 NA 16 NA 32 
+0

這是我正在努力避免的假設。但我認爲這已經夠好了...... –

+0

這不是必需的。使用允許比較訂單的格式允許刪除它。 –

3

這裏是你的數據編輯的問題:

x <- c('0:00:00', '0:30:00', '1:00:00', '1:30:00', '2:00:00', '2:30:00', 
     '3:00:00', '3:30:00', '4:00:00', '4:30:00', '5:00:00', '5:30:00', 
     '6:00:00', '6:30:00', '7:00:00', '7:30:00','8:00:00', '8:30:00', 
     '9:00:00', '9:30:00', '10:00:00', '10:30:00', '11:00:00','11:30:00', 
     '0:00:00', '0:30:00', '1:00:00', '1:30:00', '2:00:00', '2:30:00', 
     '3:00:00', '3:30:00', '4:00:00', '4:30:00', '5:00:00', '5:30:00', 
     '6:00:00', '6:30:00', '7:00:00', '7:30:00','8:00:00', '8:30:00', 
     '9:00:00', '9:30:00', '10:00:00', '10:30:00', '11:00:00','11:30:00', 
     '12:00:00', '12:30:00', '13:00:00', '13:30:00') 

y=seq(1:52) 

data1=data.frame(x,y) 

我們需要創建一個分類變量,指示天,一個我們所有的工作都是在這個時代。如果時間倒退,則認爲這是新的一天。爲此,我們將通過使用一個因子按順序將時間值轉換爲整數。

這裏是一個矢量水平levc('0:00:00', '0:30:00', '1:00:00', ...),並且其中包含相同的字符串作爲數據$ X因素fac,但使用該向量作爲級別:

lev <- paste(t(outer(0:23, c('00', '30'), paste, sep=':')), '00', sep=':') 
fac <- factor(as.character(data1$x), levels=lev, ordered=TRUE) 

現在我們看到,當我們在時間上倒退通過施加diff

d <- c(0, diff(
    as.numeric(factor(as.character(data1$x), levels=lev, ordered=TRUE))) 
     ) 

查閱(由兩個其他兩個回答這個問題的啓發),cumsum(d<0)是分類變量,我們需要,其可被施加的數據FR AME,並用於重塑:

data1$grp <- cumsum(d<0) 
res <- reshape(data1, direction="wide", idvar="x", timevar="grp") 

> res 
      x y.0 y.1 
1 0:00:00 1 25 
2 0:30:00 2 26 
3 1:00:00 3 27 
4 1:30:00 4 28 
5 2:00:00 5 29 
6 2:30:00 6 30 
7 3:00:00 7 31 
8 3:30:00 8 32 
9 4:00:00 9 33 
10 4:30:00 10 34 
11 5:00:00 11 35 
12 5:30:00 12 36 
13 6:00:00 13 37 
14 6:30:00 14 38 
15 7:00:00 15 39 
16 7:30:00 16 40 
17 8:00:00 17 41 
18 8:30:00 18 42 
19 9:00:00 19 43 
20 9:30:00 20 44 
21 10:00:00 21 45 
22 10:30:00 22 46 
23 11:00:00 23 47 
24 11:30:00 24 48 
49 12:00:00 NA 49 
50 12:30:00 NA 50 
51 13:00:00 NA 51 
52 13:30:00 NA 52 

如何從這個其他的答案有所不同:它不認爲每天總是包含時間「0:00:00」,並且它不要求數據1 $ x是一個字符變量 - 即使它是,它按照正確的順序獲得時間。比較character會說13:00:00之後發生2:00:00。

+0

非常聰明的做法。 +1 –

+0

@MthetheLundberg非常感謝您的快速回復。例如,同樣的方法似乎不適用於不同的循環時間: – Nav

+0

@MatthewLundberg x <-c('0:00:00','0:30:00','1:00:00','1:30 :00','2:00:00','2:30:00','3:00:00','3:30:00','4:00:00','4:30:00 ','5:00:00','5:30:00','6:00:00','6:30:00','7:00:00','7:30:00', '8:00:00','8:30:00','9:00:00','9:30:00','10:00:00','10:30:00','11 :00:00','11:30:00','0:00:00','0:30:00','1:00:00','1:30:00','2:00 :00','2:30:00','3:00:00','3:30:00','4:00:00','4:30:00','5:00:00 ','5:30:00','6:00:00','6:30:00','7:00:00','7:30:00','8:00:00',' '8:30:00','9:00:00','9:30:00','10:00:00','10:30:00','11:00:00','11 :30:00','12:00:00','12:30:00','13:00:00','13:30:00') – Nav

1

(參見下面的編輯。)該溶液產生的基礎上的「x」可變的序列的組變量,但要求創建具有stringsAsFactors數據幀= FALSE或轉換因子的「x」與as.character()

> data1=data.frame(x,y, stringsAsFactors=FALSE) 
> data1$grp <- with(data1, cumsum(c(0 , x[-1] < x[-length(x)]))) 
> reshape(data1, direction="wide", idvar="x", timevar="grp") 
     x y.0 y.1 y.2 y.3 
1 0:00:00 1 8 17 24 
2 0:30:00 2 9 18 25 
3 1:00:00 3 10 19 26 
4 1:30:00 4 11 20 27 
5 2:00:00 5 12 21 28 
6 2:30:00 6 13 22 29 
7 3:00:00 7 14 23 30 
15 3:30:00 NA 15 NA 31 
16 4:00:00 NA 16 NA 32 

在編輯的光:如果x變量首先轉換爲數據時間類,則相同的策略應該可以工作:

x <- as.POSIXct(x, format="%H:%M:%S") 
+0

請重新閱讀我答案中的第一句話。 –

+0

哦,是的,這將消除此錯誤。但是,對於他編輯的data1 $ x,排序順序不正確。看到我的答案編輯。 –

+1

夠正確。應該轉換爲時間或日期時間格式。 –