R:按小时划分数据
R: subset data by hour
我正在寻找一种按小时对数据进行子集化的简单方法。我只想 select 特定时间范围内的观察,比方说在 10:00 和 12:00 之间。我想最简单的方法是为此制作一个新的数据框。
我试过这段代码,但它给了我一条神秘的错误消息(错误:意外的“,”在“,”中)。另外,我认为这种方法非常复杂,一个接一个地给出错误信息。有没有更方便的方法来做到这一点?
New_df <- data.frame(
Time_part =
c("07:30", "17:20", "18:40", "19:40", "09:30", "09:40", "18:00", "16:30", "18:30", "13:50", "09:00", "12:20", "09:20", "09:00", "12:20", "20:10", "11:20", "08:10", "12:20", "13:30", "10:00", "20:40", "10:40", "12:50", "20:30", "09:30", "13:40", "10:30", "10:20", "13:00", "13:30", "10:40", "14:10", "12:40", "14:40", "16:20", "16:10", "22:40", "08:40", "13:40", "12:30", "14:20", "16:30", "15:00", "10:50", "09:40", "20:00", "12:30", "09:20", "13:10", "13:10", "08:00", "14:00", "19:30", "17:50", "16:30", "19:40", "12:40", "20:00", "07:20", "10:20", "07:30", "15:30", "20:00", "08:00", "08:50", "10:40", "12:00", "12:20", "16:30", "09:00", "20:50", "17:40", "18:50", "08:30", "13:00", "10:00", "16:20", "18:40", "19:20", "19:20", "19:40", "19:10", "11:30", "09:10", "10:10", "13:20", "15:20", "16:30", "19:30", "20:00", "09:00", "11:50", "09:00", "12:00", "13:00", "09:00", "14:10", "10:30", "13:20"))
而我本该↓
New_df %>% filter(hour(full_datetime) == 9)
数据
structure(list(Date = c("2.5.2012", "2.5.2012", "2.5.2012", "2.5.2012",
"3.5.2012", "3.5.2012", "3.5.2012", "3.5.2012", "3.5.2012", "4.5.2012",
"4.5.2012", "5.5.2012", "5.5.2012", "5.5.2012", "5.5.2012", "5.5.2012",
"6.5.2012", "6.5.2012", "7.5.2012", "7.5.2012", "8.5.2012", "8.5.2012",
"8.5.2012", "8.5.2012", "8.5.2012", "9.5.2012", "9.5.2012", "9.5.2012",
"9.5.2012", "9.5.2012", "9.5.2012", "9.5.2012", "9.5.2012", "9.5.2012",
"9.5.2012", "9.5.2012", "9.5.2012", "9.5.2012", "10.5.2012",
"10.5.2012", "10.5.2012", "10.5.2012", "10.5.2012", "10.5.2012",
"11.5.2012", "11.5.2012", "11.5.2012", "12.5.2012", "12.5.2012",
"14.5.2012", "14.5.2012", "14.5.2012", "15.5.2012", "15.5.2012",
"15.5.2012", "15.5.2012", "15.5.2012", "16.5.2012", "16.5.2012",
"17.5.2012", "17.5.2012", "17.5.2012", "17.5.2012", "17.5.2012",
"18.5.2012", "18.5.2012", "18.5.2012", "18.5.2012", "18.5.2012",
"19.5.2012", "20.5.2012", "20.5.2012", "20.5.2012", "20.5.2012",
"21.5.2012", "21.5.2012", "21.5.2012", "21.5.2012", "21.5.2012",
"21.5.2012", "21.5.2012", "21.5.2012", "22.5.2012", "22.5.2012",
"22.5.2012", "22.5.2012", "22.5.2012", "22.5.2012", "22.5.2012",
"22.5.2012", "22.5.2012", "23.5.2012", "23.5.2012", "23.5.2012",
"23.5.2012", "23.5.2012", "23.5.2012", "23.5.2012", "23.5.2012",
"23.5.2012"), Time = c("07:30", "17:20", "18:40", "19:40", "09:30",
"09:40", "18:00", "16:30", "18:30", "13:50", "09:00", "12:20",
"09:20", "09:00", "12:20", "20:10", "11:20", "08:10", "12:20",
"13:30", "10:00", "20:40", "10:40", "12:50", "20:30", "09:30",
"13:40", "10:30", "10:20", "13:00", "13:30", "10:40", "14:10",
"12:40", "14:40", "16:20", "16:10", "22:40", "08:40", "13:40",
"12:30", "14:20", "16:30", "15:00", "10:50", "09:40", "20:00",
"12:30", "09:20", "13:10", "13:10", "08:00", "14:00", "19:30",
"17:50", "16:30", "19:40", "12:40", "20:00", "07:20", "10:20",
"07:30", "15:30", "20:00", "08:00", "08:50", "10:40", "12:00",
"12:20", "16:30", "09:00", "20:50", "17:40", "18:50", "08:30",
"13:00", "10:00", "16:20", "18:40", "19:20", "19:20", "19:40",
"19:10", "11:30", "09:10", "10:10", "13:20", "15:20", "16:30",
"19:30", "20:00", "09:00", "11:50", "09:00", "12:00", "13:00",
"09:00", "14:10", "10:30", "13:20")), row.names = c(NA, -100L
), class = c("tbl_df", "tbl", "data.frame"))
您可以为小时和分钟创建一个单独的列,然后您可以 filter
小时数据。
library(dplyr)
library(tidyr)
df %>%
separate(Time, c('hour', 'minutes'), sep = ':', convert = TRUE) %>%
filter(between(hour, 10, 11))
# Date hour minutes
# <chr> <int> <int>
# 1 6.5.2012 11 20
# 2 8.5.2012 10 0
# 3 8.5.2012 10 40
# 4 9.5.2012 10 30
# 5 9.5.2012 10 20
# 6 9.5.2012 10 40
# 7 11.5.2012 10 50
# 8 17.5.2012 10 20
# 9 18.5.2012 10 40
#10 21.5.2012 10 0
#11 22.5.2012 11 30
#12 22.5.2012 10 10
#13 23.5.2012 11 50
#14 23.5.2012 10 30
他是解决你问题的另一种方式:
library(dplyr)
df %>%
filter(as.integer(substr(Time, 1, 2)) %in% 10:11)
# # A tibble: 14 x 2
# Date Time
# <chr> <chr>
# 1 6.5.2012 11:20
# 2 8.5.2012 10:00
# 3 8.5.2012 10:40
# 4 9.5.2012 10:30
# 5 9.5.2012 10:20
# 6 9.5.2012 10:40
# 7 11.5.2012 10:50
# 8 17.5.2012 10:20
# 9 18.5.2012 10:40
# 10 21.5.2012 10:00
# 11 22.5.2012 11:30
# 12 22.5.2012 10:10
# 13 23.5.2012 11:50
# 14 23.5.2012 10:30
我们可以使用parse_number
的特性来return第一个数字部分,然后用%in%
创建一个逻辑表达式
library(dplyr)
df %>%
filter(readr::parse_number(Time) %in% 10:11)
我正在寻找一种按小时对数据进行子集化的简单方法。我只想 select 特定时间范围内的观察,比方说在 10:00 和 12:00 之间。我想最简单的方法是为此制作一个新的数据框。
我试过这段代码,但它给了我一条神秘的错误消息(错误:意外的“,”在“,”中)。另外,我认为这种方法非常复杂,一个接一个地给出错误信息。有没有更方便的方法来做到这一点?
New_df <- data.frame(
Time_part =
c("07:30", "17:20", "18:40", "19:40", "09:30", "09:40", "18:00", "16:30", "18:30", "13:50", "09:00", "12:20", "09:20", "09:00", "12:20", "20:10", "11:20", "08:10", "12:20", "13:30", "10:00", "20:40", "10:40", "12:50", "20:30", "09:30", "13:40", "10:30", "10:20", "13:00", "13:30", "10:40", "14:10", "12:40", "14:40", "16:20", "16:10", "22:40", "08:40", "13:40", "12:30", "14:20", "16:30", "15:00", "10:50", "09:40", "20:00", "12:30", "09:20", "13:10", "13:10", "08:00", "14:00", "19:30", "17:50", "16:30", "19:40", "12:40", "20:00", "07:20", "10:20", "07:30", "15:30", "20:00", "08:00", "08:50", "10:40", "12:00", "12:20", "16:30", "09:00", "20:50", "17:40", "18:50", "08:30", "13:00", "10:00", "16:20", "18:40", "19:20", "19:20", "19:40", "19:10", "11:30", "09:10", "10:10", "13:20", "15:20", "16:30", "19:30", "20:00", "09:00", "11:50", "09:00", "12:00", "13:00", "09:00", "14:10", "10:30", "13:20"))
而我本该↓
New_df %>% filter(hour(full_datetime) == 9)
数据
structure(list(Date = c("2.5.2012", "2.5.2012", "2.5.2012", "2.5.2012",
"3.5.2012", "3.5.2012", "3.5.2012", "3.5.2012", "3.5.2012", "4.5.2012",
"4.5.2012", "5.5.2012", "5.5.2012", "5.5.2012", "5.5.2012", "5.5.2012",
"6.5.2012", "6.5.2012", "7.5.2012", "7.5.2012", "8.5.2012", "8.5.2012",
"8.5.2012", "8.5.2012", "8.5.2012", "9.5.2012", "9.5.2012", "9.5.2012",
"9.5.2012", "9.5.2012", "9.5.2012", "9.5.2012", "9.5.2012", "9.5.2012",
"9.5.2012", "9.5.2012", "9.5.2012", "9.5.2012", "10.5.2012",
"10.5.2012", "10.5.2012", "10.5.2012", "10.5.2012", "10.5.2012",
"11.5.2012", "11.5.2012", "11.5.2012", "12.5.2012", "12.5.2012",
"14.5.2012", "14.5.2012", "14.5.2012", "15.5.2012", "15.5.2012",
"15.5.2012", "15.5.2012", "15.5.2012", "16.5.2012", "16.5.2012",
"17.5.2012", "17.5.2012", "17.5.2012", "17.5.2012", "17.5.2012",
"18.5.2012", "18.5.2012", "18.5.2012", "18.5.2012", "18.5.2012",
"19.5.2012", "20.5.2012", "20.5.2012", "20.5.2012", "20.5.2012",
"21.5.2012", "21.5.2012", "21.5.2012", "21.5.2012", "21.5.2012",
"21.5.2012", "21.5.2012", "21.5.2012", "22.5.2012", "22.5.2012",
"22.5.2012", "22.5.2012", "22.5.2012", "22.5.2012", "22.5.2012",
"22.5.2012", "22.5.2012", "23.5.2012", "23.5.2012", "23.5.2012",
"23.5.2012", "23.5.2012", "23.5.2012", "23.5.2012", "23.5.2012",
"23.5.2012"), Time = c("07:30", "17:20", "18:40", "19:40", "09:30",
"09:40", "18:00", "16:30", "18:30", "13:50", "09:00", "12:20",
"09:20", "09:00", "12:20", "20:10", "11:20", "08:10", "12:20",
"13:30", "10:00", "20:40", "10:40", "12:50", "20:30", "09:30",
"13:40", "10:30", "10:20", "13:00", "13:30", "10:40", "14:10",
"12:40", "14:40", "16:20", "16:10", "22:40", "08:40", "13:40",
"12:30", "14:20", "16:30", "15:00", "10:50", "09:40", "20:00",
"12:30", "09:20", "13:10", "13:10", "08:00", "14:00", "19:30",
"17:50", "16:30", "19:40", "12:40", "20:00", "07:20", "10:20",
"07:30", "15:30", "20:00", "08:00", "08:50", "10:40", "12:00",
"12:20", "16:30", "09:00", "20:50", "17:40", "18:50", "08:30",
"13:00", "10:00", "16:20", "18:40", "19:20", "19:20", "19:40",
"19:10", "11:30", "09:10", "10:10", "13:20", "15:20", "16:30",
"19:30", "20:00", "09:00", "11:50", "09:00", "12:00", "13:00",
"09:00", "14:10", "10:30", "13:20")), row.names = c(NA, -100L
), class = c("tbl_df", "tbl", "data.frame"))
您可以为小时和分钟创建一个单独的列,然后您可以 filter
小时数据。
library(dplyr)
library(tidyr)
df %>%
separate(Time, c('hour', 'minutes'), sep = ':', convert = TRUE) %>%
filter(between(hour, 10, 11))
# Date hour minutes
# <chr> <int> <int>
# 1 6.5.2012 11 20
# 2 8.5.2012 10 0
# 3 8.5.2012 10 40
# 4 9.5.2012 10 30
# 5 9.5.2012 10 20
# 6 9.5.2012 10 40
# 7 11.5.2012 10 50
# 8 17.5.2012 10 20
# 9 18.5.2012 10 40
#10 21.5.2012 10 0
#11 22.5.2012 11 30
#12 22.5.2012 10 10
#13 23.5.2012 11 50
#14 23.5.2012 10 30
他是解决你问题的另一种方式:
library(dplyr)
df %>%
filter(as.integer(substr(Time, 1, 2)) %in% 10:11)
# # A tibble: 14 x 2
# Date Time
# <chr> <chr>
# 1 6.5.2012 11:20
# 2 8.5.2012 10:00
# 3 8.5.2012 10:40
# 4 9.5.2012 10:30
# 5 9.5.2012 10:20
# 6 9.5.2012 10:40
# 7 11.5.2012 10:50
# 8 17.5.2012 10:20
# 9 18.5.2012 10:40
# 10 21.5.2012 10:00
# 11 22.5.2012 11:30
# 12 22.5.2012 10:10
# 13 23.5.2012 11:50
# 14 23.5.2012 10:30
我们可以使用parse_number
的特性来return第一个数字部分,然后用%in%
library(dplyr)
df %>%
filter(readr::parse_number(Time) %in% 10:11)