r - 如何为长时间数据框创建列中时间和行中日期的矩阵?
问题描述
我是新来的,所以...我有一个带有两个变量的数据框(R 对我来说是新的,我使用 Matlab 很长时间了)。一个是经典的 POSIXlt,每个数据点之间的时间戳为 30 分钟。第二个是数据本身(例如,气温数据)和与时间向量相同的维度。我用这对来获得漂亮的情节。我想以这种方式使用时间重塑数据:我想使用行方向的天数和列中的时间(最多 48 列,使用 0:00 和 23:30 之间的 30 分钟间隔)对数据进行排序-direction,在另一个 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 ... ... ... ... ... ... ... ... ... ... ... ...
...
...
我一直在移植一个 Matlab 函数(为我自己编写)来实现这一点,但没有成功,顺便说一下 R 解释日期和时间的方式。
更新:如何生成数据。(考虑到原始数据来自我工作的 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>
由于新变量的名称可以更改,您可以重新排列它们。
推荐阅读
- macos - Clion 找不到使用自制软件安装的库
- sql-server-2012 - 获取“两天前”日期sql server
- c++ - OpenCV C++ 在 Macbook M1 芯片中给出架构 arm64 错误
- jenkins - 如何在groovy中的数组中获取正确的正则表达式
- html - Puppeteer 屏幕未正确垂直居中 flexbox 项目
- api - 比较 JMETER 断言中的 ISO 时间
- typescript - TypeScript - 描述一个可变长度的数组,但至少有一个特定的强制条目
- python - NN 用于带有附加信息的时间序列分类
- gitlab-ci - 为什么我让 Composer 找不到 composer.json 文件?
- flutter - Dart 返回 Future.value 始终为 null