gpt4 book ai didi

r - 拆分数据框

转载 作者:行者123 更新时间:2023-12-01 11:48:09 25 4
gpt4 key购买 nike

圣诞快乐

我想拆分一个长数据帧。数据框看起来像这样

    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

我为此考虑的任何想法或功能?我尝试使用拆分功能,但无法完成。非常感谢您的帮助和时间。

Matthew 的以下解决方案效果最好。但是,如果我增加 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

干杯,斯瓦加特

最佳答案

这是您编辑的问题的数据:

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)

我们需要创建一个表示天数的分类变量,在这里我们所要做的就是时间。如果时间倒退,假设这是新的一天。为此,我们将使用一个因子按顺序将时间值转换为整数。

这是一个向量 lev级别,c('0:00:00', '0:30:00', '1:00:00', ...) , 和一个因子 fac它包含与 data$x 相同的字符串,但使用此向量作为级别:

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)是我们需要的分类变量,可以应用于数据框,并用于 reshape :

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”,并且它不要求 data1$x 是字符变量——即使它也就是说,它以正确的顺序获取时间。比较character会说 2:00:00 发生在 13:00:00 之后。

关于r - 拆分数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14035174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com