2017-09-23 93 views
0

我有一个多年的大型数据集,它有几个变量,但我感兴趣的是风速和日期时间。我想查找数据集中每天最大风速的时间。我有Posixct格式的小时数据,WS是偶数NAs的数字。下面是一个简短的数据集,希望能够说明我的观点,但是我的dateTime并不是小时数据,但它提供了足够的样本。查找气候数据中每日每日最大变量

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日期(减时间)的新列允许天的隔离,但是所有的我已经试过只用日期和WS(合计返回缩短数据帧的事情,分裂,xts)。总计只是一个没有这样做,但是,它给了我23:00: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等,但没有人回答过这个问题,或者解决方案没有得到理想的结果。

我需要将此分析的结果与另一个数据框进行比较,因此我需要数据集中每天发生最大风速时的实际时间。我有一种感觉,有一个简单的解决方案,但是,这让我感到沮丧。

回答

1

Dee问:“我想找出e最大风速的时间数据集中的一天。“其他答案已经计算出每天的最大值(WS),但不是发生在哪个小时。

所以我建议用dyplr以下解决方案:

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)]) 

enter image description here

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

enter image description here

+0

谢谢@塞缪尔。我希望因为我的观测数据已经从km h-1转换为m s-1,所以对于这个练习来说它是独一无二的 – Dee

2

dplyr溶液可以是:

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 
+0

嗨@Kevin Arseneau我已经尝试过的样本数据,并得到一个错误'by'不能包含联接列'date'这是从RHS丢失。有没有解决这个问题? – Dee

+0

@Dee,检查您正在运行的代码。当我从你的问题中立即运行代码后,我没有错误。我认为你一定是错过了一些东西,我在'left_join'中的'mutate'语句为右边(RHS)创建了'date'列。 –

+0

Hi @Kevin Arseneau。我关闭了R并重新启动。有用。如果所有其他都无法重新启动帮助... :)谢谢! – Dee

0

为了完整性的缘故(和因为我喜欢的简洁的代码)这里是一个 “单行” 使用data.table

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

感谢您的短代码。它看起来非常优雅。我会尝试一下我的数据,看看结果如何。 – Dee

相关问题