gpt4 book ai didi

r - dplyr 使用 lubridate::hhmm 格式和 minute() 进行过滤

转载 作者:行者123 更新时间:2023-12-01 14:23:52 24 4
gpt4 key购买 nike

回答这个问题 Temperature curve in R 我遇到了 dplyr::filter - lubridate::minute 组合的奇怪行为。

见下面的测试数据dtadta$time 是一种 lubridate::hhmm 格式。

library(lubridate)
library(dplyr)

dta$Time <- hm(dta$Time)

要仅获取具有完整小时(即 0 分钟)的行,可以使用 lubridate::minute 子集,如下所示:

dta[minute(dta$Time) == 0,]
# Time Temp1 Temp2
# 1 0S 18.62800 18.54458
# 7 1H 0M 0S 18.45733 18.22625
# 13 2H 0M 0S 18.33258 18.04142

但是,当使用dplyrfilter时,像这样

dta %>% filter(minute(Time) == 0)
# Time Temp1 Temp2
# 1 0S 18.62800 18.54458
# 2 10M 0S 18.45733 18.22625
# 3 20M 0S 18.33258 18.04142

结果并不符合预期。 (更新:Temp1Temp2 的值是正确的,只有 Time 损坏了...感谢 @Brian顺便说一句,给了这个提示。)

此外还会返回此警告:

Warning message:
In format.data.frame(x, digits = digits, na.encode = FALSE) :
corrupt data frame: columns will be truncated or padded with NAs

这也被报道并以某种方式解决了 here ,但只是通过强制,这似乎消除了 lubridate 的有趣(和非常可读)的部分。

问题:有没有办法(迄今为止)dplyr::filter lubridate::hhmm(ss) 格式而不强制它性格等?

更新:

似乎是由

创建的向量
minute(dta$Time)
# [1] 0 10 20 30 40 50 0 10 20 30 40 50 0

看起来像一个数值向量,但似乎有一些神秘的特性。

此外,正如@Lyngbakr 指出的那样,即使与 == 的比较也不具有作为“正常”逻辑向量的通常特征。

tst <- minute(dta$Time) == 0 
dta %>% filter(tst)

将导致同样奇怪的 Time 列。

示例数据:

dta <- read.table(text = "     Time        Temp1       Temp2
1 00:00 18.62800 18.54458
2 00:10 18.60025 18.48283
3 00:20 18.57250 18.36767
4 00:30 18.54667 18.36950
5 00:40 18.51483 18.36550
6 00:50 18.48325 18.34783
7 01:00 18.45733 18.22625
8 01:10 18.43767 18.19067
9 01:20 18.41583 18.22042
10 01:30 18.39608 18.21225
11 01:40 18.37625 18.18658
12 01:50 18.35633 18.05942
13 02:00 18.33258 18.04142", header = T)

最佳答案

我不知道为什么会这样,但确实如此:Time 列的类型必须是 datetime,而不是 Period

dta %>% 
mutate(Time = as_datetime(hm(Time))) %>%
filter(minute(Time) == 0)
                 Time    Temp1    Temp2
1 1970-01-01 00:00:00 18.62800 18.54458
2 1970-01-01 01:00:00 18.45733 18.22625
3 1970-01-01 02:00:00 18.33258 18.04142

这有一个副作用,就是将 Time 列中的时间添加到 Unix 纪元,因此我建议您在使用纯时间数据时始终包含实际日期。

如果这是自实验开始以来经过的分钟数,那么这并不重要,您不必显示 1970-01-01 部分。

关于r - dplyr 使用 lubridate::hhmm 格式和 minute() 进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45801415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com