【问题标题】:Looking for R code to sum a variable across rows based off a range of possible values contained within the same row查找 R 代码以根据同一行中包含的一系列可能值对跨行的变量求和
【发布时间】:2020-03-11 23:10:28
【问题描述】:

我正在使用一个简单的数据集。它包含三个感兴趣的变量。 1. 日期 YYYY-MM-DD 2. 每小时 (##) 3. Precip_H (#.##)。

我的情况是,我正在尝试查找代码,例如,对等于特定 DATE 且在 00-11 范围内的 Hourly 值的行中的 precip_H 值求和。然后下一组将做同样的事情,但每小时 12-23 范围。

此数据集是一个每小时报告降水量的气象站。我想要做的是使用该信息在数据集的所有日子里每天制作两个 12 小时的降水值。

   DATE       TIME  PRECIP_H DATEyyyy DATEmm DATEdd
   <date>     <chr>    <dbl>    <dbl>  <dbl>  <dbl>
 1 2019-06-05 17           0     2019      6      5
 2 2019-06-01 20           0     2019      6      1
 3 2019-06-06 19           0     2019      6      6
 4 2019-05-27 00           0     2019      5     27
 5 2019-08-25 20           0     2019      8     25
 6 2019-08-08 04           0     2019      8      8
 7 2019-09-01 07           0     2019      9      1
 8 2019-07-18 21           0     2019      7     18
 9 2019-06-18 23           0     2019      6     18
10 2019-08-11 12           0     2019      8     11

library(readxl)
precip2019 <- Clean_Chicago_Midway_Precp_Hourly_2019_1945790 <- read_excel("S:/Natural Resources/Staff/Beach Management/Beaches Main/+ DATA ANALYSIS +/Beaches 2019/Master Files/Clean_Chicago Midway Precp Hourly 2019_1945790.xlsx")


names(precip2019)[names(precip2019) == "HourlyPrecipitation"] <- "PRECIP_H"


precip2019$DATE <- as.Date(precip2019$DATE, format = '%Y-%m-%d')
precip2019$DATEyyyy <- as.numeric(format(precip2019$DATE, '%Y'))
precip2019$DATEmm <- as.numeric(format(precip2019$DATE, '%m'))
precip2019$DATEdd <- as.numeric(format(precip2019$DATE, '%d'))

prec_sum <- precip2019 %>% 
  select(DATE, TIME, starts_with("PREC")) %>% 
  mutate(Period = case_when(between(TIME, 0, 11) ~ "1st_half",
                            TRUE ~ "2nd_half")) %>% 
  group_by(DATE, Period) %>% 
  summarise_at(vars(starts_with("PREC")), list(~ sum(., na.rm = TRUE))) %>% 
  ungroup()
View(prec_sum) 

【问题讨论】:

标签: r sum weather noaa


【解决方案1】:

这可能适用于您的情况。首先,我们需要根据时间范围(case_when)创建一个Period 列。然后根据DATEPeriod (summarise_at) 的一组两列进行求和。

library(dplyr)

prec_sum <- prec_data %>% 
  select(DATE, TIME, starts_with("PREC")) %>% 
  mutate(TIME = as.numeric(TIME)) %>% 
  mutate(Period = case_when(between(TIME, 0, 11) ~ "1st_half",
                            TRUE ~ "2nd_half")) %>% 
  group_by(DATE, Period) %>% 
  summarise_at(vars(starts_with("PREC")), list(~ sum(., na.rm = TRUE))) %>% 
  ungroup()

【讨论】:

  • 我收到此错误:错误:与请求的类型不兼容:[type=character;目标=双]。我只修改为包含数据集名称: prec_sum % select(DATE, TIME, starts_with("PREC")) %>% mutate(Period = case_when(between(TIME, 0, 11) ~ " 1st_half", TRUE ~ "2nd_half")) %>% group_by(DATE, Period) %>% summarise_at(vars(starts_with("PREC")), list(~ sum(., na.rm = TRUE))) % >% 取消分组()
  • 请按照我发布的链接中的说明发布您的数据集样本。如果不查看数据,几乎不可能知道为什么会发生错误
  • 现在看看
  • 更好但还不能重现。请参阅此示例stackoverflow.com/q/56811184/786542。确保其他人可以复制和粘贴代码,然后在另一台计算机上运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多