如何解决如何为长时间数据帧创建一个以列为单位的时间和行为日期的矩阵?
我是新来的,所以... 我有一个带有两个变量的数据框(R对我来说是新的,我长期使用Matlab)。一种是经典的POSIXlt,其时间戳在每个数据点之间间隔30分钟。第二个是数据本身(例如,空气温度数据)以及具有时间向量的相同维度。我用这对获得漂亮的地块。 我想以这种方式使用时间来重塑数据:我想使用列中的天数和行方向和时间(最多48列,使用0:00和23:30之间的30分钟间隔)对数据进行排序方向,以在另一个R包中使用此数据来填充丢失的数据。
>> head(data_f,10)
time data
1 2013-08-01 00:30:00 8.001
2 2013-08-01 01:00:00 7.918
3 2013-08-01 01:30:00 7.621
4 2013-08-01 02:00:00 7.564
5 2013-08-01 02:30:00 7.718
6 2013-08-01 03:00:00 7.846
7 2013-08-01 03:30:00 7.481
8 2013-08-01 04:00:00 7.351
9 2013-08-01 04:30:00 7.275
10 2013-08-01 05:00:00 7.291
更多数据
48 2013-08-02 00:00:00 9.372
49 2013-08-02 00:30:00 9.485
50 2013-08-02 01:00:00 9.151
51 2013-08-02 01:30:00 8.870
52 2013-08-02 02:00:00 8.504
53 2013-08-02 02:30:00 8.404
54 2013-08-02 03:00:00 8.342
55 2013-08-02 03:30:00 8.278
56 2013-08-02 04:00:00 8.229
57 2013-08-02 04:30:00 8.163
58 2013-08-02 05:00:00 8.092
59 2013-08-02 05:30:00 8.038
我想要一个理想的矩形输出(可以是一个矩阵而不是一个数据帧),将NAs放在当时没有可用数据的地方。像这样:
(30-min span in this direction -->)
2013-08-01 NA 8.001 7.918 7.621 7.564 7.718 7.846 7.481 7.351 7.275 7.291 ...
2013-08-02 9.372 9.485 9.151 8.870 8.504 8.404 8.342 8.278 8.229 8.092 8.038 ...
2013-08-03 ... ... ... ... ... ... ... ... ... ... ... ...
2013-08-04 ... ... ... ... ... ... ... ... ... ... ... ...
...
...
我已经尝试通过移植R解释日期和时间的方式来移植Matlab函数(为我自己写)来完成该任务,但没有成功。
更新:如何生成数据。 (考虑到原始数据来自我工作的7年数据库)
library(lubridate)
data_f = data.frame(time = seq(from = as_datetime("2013-08-01 00:30:00"),to = as_datetime("2013-10-12 18:00:00"),by = "30 min"),data = runif(3491,2,14))
谢谢。
解决方法
您可能会采用的一种方法是分离日期和时间,然后重塑数据。以下是带有tidyverse
函数的代码:
#Data
df <- structure(list(time = structure(c(1375317000,1375318800,1375320600,1375322400,1375324200,1375326000,1375327800,1375329600,1375331400,1375333200,1375401600,1375403400,1375405200,1375407000,1375408800,1375410600,1375412400,1375414200,1375416000,1375417800,1375419600,1375421400),class = c("POSIXct","POSIXt"),tzone = "GMT"),data = c(8.001,7.918,7.621,7.564,7.718,7.846,7.481,7.351,7.275,7.291,9.372,9.485,9.151,8.87,8.504,8.404,8.342,8.278,8.229,8.163,8.092,8.038)),class = "data.frame",row.names = c(NA,-22L))
代码:
#Split and reshape
df %>% separate(time,into = c('V1','V2'),sep = ' ') %>%
pivot_wider(names_from = V2,values_from=data)
输出:
# A tibble: 2 x 13
V1 `00:30:00` `00:59:59` `01:30:00` `02:00:00` `02:29:59` `03:00:00` `03:30:00` `03:59:59` `04:30:00`
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2013~ 8.00 7.92 7.62 7.56 7.72 7.85 7.48 7.35 7.28
2 2013~ 9.48 9.15 8.87 8.50 8.40 8.34 8.28 8.23 8.16
# ... with 3 more variables: `05:00:00` <dbl>,`00:00:00` <dbl>,`05:29:59` <dbl>
由于新变量的名称可以更改,因此您可以重新排列它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。