首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在气候数据中寻找每日最大变量的每一次

在气候数据中寻找每日最大变量的每一次
EN

Stack Overflow用户
提问于 2017-09-23 04:01:16
回答 3查看 120关注 0票数 0

多年来我有一个很大的数据集,它有几个变量,但我感兴趣的是风速和dateTime。我想在数据集中找到每天最大风速的时间。我有Po-6 in格式的每小时数据,WS作为一个数字,偶尔带有NAs。下面是一个简短的数据集,希望能说明我的观点,但是我的dateTime并不是每小时的数据,但是它为一个示例提供了足够的数据。

代码语言:javascript
复制
dateTime <- seq(as.POSIXct("2011-01-01 00:00:00", tz = "GMT"),
            as.POSIXct("2011-01-29 23:00:00", tz = "GMT"),
            by = 60*24)
WS <- sample(0:20,1798,rep=TRUE)
WD <- sample(0:390,1798,rep=TRUE)
Temp <- sample(0:40,1798,rep=TRUE)
df <- data.frame(dateTime,WS,WD,Temp)
df$WS[WS>15] <- NA

我以前尝试过创建一个只有posix日期(减去时间)的新列,以允许日隔离,但是我尝试过的所有事情都只返回了一个带有date和WS (聚合、拆分、xts)的缩短的数据帧。聚合只是没有做到这一点,然而,它给了我23:00作为一个固定的时间,这是不正确的。

我看过How to calculate daily means, medians, from weather variables data collected hourly in R?https://stats.stackexchange.com/questions/7268/how-to-aggregate-by-minute-data-for-a-week-into-hourly-means和其他人,但是没有人回答这个问题,或者解决方案没有返回一个理想的结果。

我需要将这个分析的结果与另一个数据框架进行比较,因此我需要数据集中每天出现最大风速时的实际时间。我有一种感觉,有一个简单的解决办法,然而,这让我很沮丧。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-23 09:06:12

迪伊问:“我想找出数据集中每天最大风速的时间。”其他答案计算了每天的最大值(WS),但没有计算出发生在哪一小时。

因此,我用dyplr提出以下解决方案:

代码语言:javascript
复制
library(dplyr)
set.seed(12345)
dateTime <- seq(as.POSIXct("2011-01-01 00:00:00", tz = "GMT"),
                as.POSIXct("2011-01-29 23:00:00", tz = "GMT"),
                by = 60*24)
WS <- sample(0:20,1738,rep=TRUE)
WD <- sample(0:390,1738,rep=TRUE)
Temp <- sample(0:40,1738,rep=TRUE)
df <- data.frame(dateTime,WS,WD,Temp)
df$WS[WS>15] <- NA

df %>% 
  group_by(Date = as.Date(dateTime)) %>% 
  mutate(Hour = hour(dateTime),
         Hour_with_max_ws = Hour[which.max(WS)])

我想强调的是,如果有几个小时有相同的最大风速(在下面的例子: 15),只有第一个小时的最大值(WS)将显示出来,虽然风速15是在那一天在0,3,4,21和22小时!所以你可能需要一个更具体的逻辑。

票数 1
EN

Stack Overflow用户

发布于 2017-09-23 04:11:16

dplyr解决方案可以是:

代码语言:javascript
复制
library(dplyr)

df %>%
  mutate(date = as.Date(dateTime)) %>%
  left_join(
    df %>%
      mutate(date = as.Date(dateTime)) %>%
      group_by(date) %>%
      summarise(max_ws = max(WS, na.rm = TRUE)) %>%
      ungroup(),
    by = "date"
  ) %>%
  select(-date)

#                 dateTime WS  WD Temp max_ws
# 1    2011-01-01 00:00:00 NA 313    2     15
# 2    2011-01-01 00:24:00  7 376    1     15
# 3    2011-01-01 00:48:00  3  28   28     15
# 4    2011-01-01 01:12:00 15 262   24     15
# 5    2011-01-01 01:36:00  1 149   34     15
# 6    2011-01-01 02:00:00  4 319   33     15
# 7    2011-01-01 02:24:00 15 280   22     15
# 8    2011-01-01 02:48:00 NA 110   23     15
# 9    2011-01-01 03:12:00 12  93   15     15
# 10   2011-01-01 03:36:00  3   5    0     15
票数 2
EN

Stack Overflow用户

发布于 2017-09-23 06:37:48

为了完整性(而且我喜欢简洁的代码),这里有一个使用data.table的“一行”。

代码语言:javascript
复制
library(data.table)
setDT(df)[, max.ws := max(WS, na.rm = TRUE), by = as.IDate(dateTime)][]

dateTime WS WD Temp max.ws 1: 2011-01-01 00:00:00 NA 293 22 15 2: 2011-01-01 00:24:00 15 55 14 15 3: 2011-01-01 00:48:00 NA 186 24 15 4: 2011-01-01 01:12:00 4 300 22 15 5: 2011-01-01 01:36:00 0 120 36 15 --- 1734: 2011-01-29 21:12:00 12 249 5 15 1735: 2011-01-29 21:36:00 9 282 21 15 1736: 2011-01-29 22:00:00 12 238 6 15 1737: 2011-01-29 22:24:00 10 127 21 15 1738: 2011-01-29 22:48:00 13 297 0 15

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46375904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档