[英]Split the dataframe by date in r
我有一个数据集,它有一个日期列和一个数据列。
每个日期的行数可能不一样,有的可能只有 10 行而不是 24 行。 数据集是这样的:
日期 | 小时 | 价值 |
---|---|---|
2000 年 10 月 6 日 | 1 | 4 |
2 | 5 | |
3 | 7 | |
4 | 7 | |
5 | 8 | |
6 | 1 | |
7 | 7 | |
8 | 2 | |
9 | 3 | |
10 | 4 | |
11 | 5 | |
12 | 7 | |
13 | 8 | |
14 | 9 | |
15 | 10 | |
16 | 12 | |
17 | 1 | |
18 | 4 | |
19 | 7 | |
20 | 9 | |
21 | 10 | |
22 | 7 | |
23 | 8 | |
24 | 9 | |
2000 年 11 月 6 日 | 9 | 1 |
10 | 4 | |
11 | 5 | |
12 | 7 | |
13 | 8 | |
14 | 9 | |
15 | 10 | |
16 | 12 | |
17 | 1 | |
18 | 4 | |
19 | 7 | |
20 | 9 | |
21 | 10 | |
22 | 7 | |
23 | 8 | |
24 | 9 |
我想按日期将数据集拆分为多个数据框。 但是,在 date 变量中,两个日期之间的元素为空。 当我尝试在基础 r 中使用拆分 function 时,function 仅返回每个日期的第一行:
$`2000-06-11`
V1 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16
264 2000-06-11 2 7 8 3 2 3 4 7 4 5 8
$`2000-06-12`
V1 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16
278 2000-06-12 2 2 9 6 2 3 1 0 1 4 4
抱歉问了这么简单的问题,我尝试使用for循环来处理这个问题,但是数据集太大,运行速度很慢。
如果您确定数据以正确的顺序排序,则可以使用tidyr::fill
:
library(tidyr)
df <- data.frame(
Date = c("10-06-2000", rep(NA, 5), "11-06-2000", rep(NA, 12)),
hour = c(4:9, 1:13),
value = 1:19
)
df_filled <- fill(df, Date, .direction = "down")
split(df_filled, df_filled$Date)
$`10-06-2000`
Date hour value
1 10-06-2000 4 1
2 10-06-2000 5 2
3 10-06-2000 6 3
4 10-06-2000 7 4
5 10-06-2000 8 5
6 10-06-2000 9 6
$`11-06-2000`
Date hour value
7 11-06-2000 1 7
8 11-06-2000 2 8
9 11-06-2000 3 9
10 11-06-2000 4 10
11 11-06-2000 5 11
12 11-06-2000 6 12
13 11-06-2000 7 13
14 11-06-2000 8 14
15 11-06-2000 9 15
16 11-06-2000 10 16
17 11-06-2000 11 17
18 11-06-2000 12 18
19 11-06-2000 13 19
您还可以将group_split()
与fill()
结合使用:
library(tidyr)
library(dplyr)
df <- data.frame(
Date = c("10-06-2000", rep(NA, 5), "11-06-2000", rep(NA, 12)),
hour = c(4:9, 1:13),
value = 1:19
)
df_filled <- df |>
fill(Date, .direction = "down") |>
group_split(Date) |>
purrr::set_names(unique(df$Date)[!is.na(unique(df$Date))])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.