2012-12-26 49 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

够正确。应该转换为时间或日期时间格式。 –