如何从数据集中选择小时值?
How to pick hourly values from dataset?
我需要帮助解决这个问题:
我有一个每 30 分钟分布一次的水位值数据集,但我只需要每小时的值。我尝试使用 aggregate()
函数,但由于函数 FUN
是一个必要条件,它确定我的分析是均值或中位数,我不想使用任何统计函数。
这是我的数据框的一个例子
06/16/2015 02:00:00 0.036068
06/16/2015 02:30:00 0.008916
06/16/2015 03:00:00 -0.008622
06/16/2015 03:30:00 -0.014057
06/16/2015 04:00:00 -0.011172
06/16/2015 04:30:00 0.002401
06/16/2015 05:00:00 0.029632
06/16/2015 05:30:00 0.061902002
06/16/2015 06:00:00 0.087366998
06/16/2015 06:30:00 0.105176002
06/16/2015 07:00:00 0.1153
06/16/2015 07:30:00 0.126197994
06/16/2015 08:00:00 0.144154996
我们将'RefDateTimeRef'列转换为POSIXct
,提取'minute'、'second'与format
并与00:00
进行比较return 我们用来对行进行子集化的逻辑向量。
df1[format(as.POSIXct(df1[,1], format = "%m/%d/%Y %H:%M"), "%M:%S")=="00:00",]
# RefDateTimeRef Data
#10 04/14/2016 09:00 0.153
#22 04/14/2016 08:00 0.148
或 lubridate
library(lubridate)
df1[ minute(mdy_hm(df1[,1]))==0,]
# RefDateTimeRef Data
#10 04/14/2016 09:00 0.153
#22 04/14/2016 08:00 0.148
或使用 sub
删除子字符串直到小时部分,然后使用 ==
获取逻辑向量并对行进行子集化。
df1[ sub(".*\s+\S{2}:", "", df1[,1])=="00",]
注意:我建议不要使用 sub
或 substr
,因为它有时会导致错误的答案。
df <- read.table(text = '06/16/2015 02:00:00 0.036068
06/16/2015 02:30:00 0.008916
06/16/2015 03:00:00 -0.008622
06/16/2015 03:30:00 -0.014057
06/16/2015 04:00:00 -0.011172
06/16/2015 04:30:00 0.002401
06/16/2015 05:00:00 0.029632
06/16/2015 05:30:00 0.061902002
06/16/2015 06:00:00 0.087366998
06/16/2015 06:30:00 0.105176002
06/16/2015 07:00:00 0.1153
06/16/2015 07:30:00 0.126197994
06/16/2015 08:00:00 0.144154996')
colnames(df) <- c('Date','Time','Value')
index <- ifelse(substring(df$Time,4) == "00:00",T,F)
final_df <- df[index,]
我需要帮助解决这个问题:
我有一个每 30 分钟分布一次的水位值数据集,但我只需要每小时的值。我尝试使用 aggregate()
函数,但由于函数 FUN
是一个必要条件,它确定我的分析是均值或中位数,我不想使用任何统计函数。
这是我的数据框的一个例子
06/16/2015 02:00:00 0.036068
06/16/2015 02:30:00 0.008916
06/16/2015 03:00:00 -0.008622
06/16/2015 03:30:00 -0.014057
06/16/2015 04:00:00 -0.011172
06/16/2015 04:30:00 0.002401
06/16/2015 05:00:00 0.029632
06/16/2015 05:30:00 0.061902002
06/16/2015 06:00:00 0.087366998
06/16/2015 06:30:00 0.105176002
06/16/2015 07:00:00 0.1153
06/16/2015 07:30:00 0.126197994
06/16/2015 08:00:00 0.144154996
我们将'RefDateTimeRef'列转换为POSIXct
,提取'minute'、'second'与format
并与00:00
进行比较return 我们用来对行进行子集化的逻辑向量。
df1[format(as.POSIXct(df1[,1], format = "%m/%d/%Y %H:%M"), "%M:%S")=="00:00",]
# RefDateTimeRef Data
#10 04/14/2016 09:00 0.153
#22 04/14/2016 08:00 0.148
或 lubridate
library(lubridate)
df1[ minute(mdy_hm(df1[,1]))==0,]
# RefDateTimeRef Data
#10 04/14/2016 09:00 0.153
#22 04/14/2016 08:00 0.148
或使用 sub
删除子字符串直到小时部分,然后使用 ==
获取逻辑向量并对行进行子集化。
df1[ sub(".*\s+\S{2}:", "", df1[,1])=="00",]
注意:我建议不要使用 sub
或 substr
,因为它有时会导致错误的答案。
df <- read.table(text = '06/16/2015 02:00:00 0.036068
06/16/2015 02:30:00 0.008916
06/16/2015 03:00:00 -0.008622
06/16/2015 03:30:00 -0.014057
06/16/2015 04:00:00 -0.011172
06/16/2015 04:30:00 0.002401
06/16/2015 05:00:00 0.029632
06/16/2015 05:30:00 0.061902002
06/16/2015 06:00:00 0.087366998
06/16/2015 06:30:00 0.105176002
06/16/2015 07:00:00 0.1153
06/16/2015 07:30:00 0.126197994
06/16/2015 08:00:00 0.144154996')
colnames(df) <- c('Date','Time','Value')
index <- ifelse(substring(df$Time,4) == "00:00",T,F)
final_df <- df[index,]