我正在尝试创建一个列,通过 R 中的季节和年份来识别遥测检测

问题描述 投票:0回答:1

我有一个遥测数据集,我正在尝试将其与我拥有的食物供应数据集合并。为此,我需要在遥测数据中创建一个列,通过定义的季节和该季节的年份来识别检测。例如,2021 年 12 月 - 2022 年 2 月将是冬季 ('21)。

Sample Data

Receiver Date       Time  TOA   TagID Type  Value Power timestamp           BATCH Beacon Serial. Release Relea…¹ River…²   RKM Locale GPS.C…³ X     Active INACT…⁴ Init.…⁵ Last.…⁶
  <chr>    <chr>      <chr> <chr> <chr> <chr> <chr> <chr> <dttm>              <chr>  <int>   <int> <chr>     <int>   <dbl> <dbl> <chr>  <chr>   <chr> <chr>  <chr>   <chr>   <chr>  
1 3024     11/23/2021 15:5… 0.75… 39000 T     16.4  516   2021-11-23 15:54:42 MF B…   3024      NA ""           NA    184.  296. ""     N 32.1… W 08… Yes    ""      3/1/21  1/14/22
2 3024     11/23/2021 15:4… 0.24… 39100 T     16.4  56    2021-11-23 15:48:20 MF B…   3024      NA ""           NA    184.  296. ""     N 32.1… W 08… Yes    ""      3/1/21  1/14/22
3 3024     11/23/2021 15:4… 0.24… 39100 P     10.0  63    2021-11-23 15:48:30 MF B…   3024      NA ""           NA    184.  296. ""     N 32.1… W 08… Yes    ""      3/1/21  1/14/22
4 3024     11/23/2021 15:4… 0.24… 39100 T     16.4  159   2021-11-23 15:49:00 MF B…   3024      NA ""           NA    184.  296. ""     N 32.1… W 08… Yes    ""      3/1/21  1/14/22
5 3024     11/23/2021 15:4… 0.76… 39000 P     7.0   561   2021-11-23 15:49:12 MF B…   3024      NA ""           NA    184.  296. ""     N 32.1… W 08… Yes    ""      3/1/21  1/14/22
6 3024     11/23/2021 15:4… 0.24… 39100 P     12.0  472   2021-11-23 15:49:30 MF B…   3024      NA ""           NA    184.  296. ""     N 32.1… W 08… Yes    ""      3/1/21  1/14/22

我修改了在另一篇文章中找到的代码,但无法使其工作。我收到错误消息! 'vec' 必须按非递减排序且不包含 NA。任何帮助将不胜感激。

date2season <- function(date) {
  season_start <- c("09-01-2021", "12-01-2021", "03-01-2022", "06-01-2022", "09-01-2022", "12-01-2022", "03-01-2023", "06-01-2023", "09-01-2023") # mmdd
  season_name <- c("FALL ('21)", "WINTER ('21)", "SPRING ('22)", "SUMMER ('22)", "FALL ('22)", "WINTER ('22)", "SPRING ('23)", "SUMMER ('23)", "FALL ('23)")
  mmddyyy <- format(date, "%m%d%Y")
  season_name[findInterval(mmddyyy, season_start)] ##
}

dat2 <- dat
dat2 <- dat2[order(as.Date(dat2$Date, format="%m/%d/%Y")),] # sorting by date, so that manual data now is with the passive data


class(dat2$Date) # checking that Date was converted to Date format
dat2 <- dat %>% mutate(sxy = date2season(as.Date(Date, "%m/%d/%Y")))

error:
> dat2 <- dat %>% mutate(sxy = date2season(as.Date(Date, "%m/%d/%Y")))
Error in `mutate()`:
! Problem while computing `sxy = date2season(as.Date(Date, "%m/%d/%Y"))`.
Caused by error in `findInterval()`:
! 'vec' must be sorted non-decreasingly and not contain NAs
Backtrace:
 1. dat %>% mutate(sxy = date2season(as.Date(Date, "%m/%d/%Y")))
 7. global date2season(as.Date(Date, "%m/%d/%Y"))
 8. base::findInterval(mmddyyy, season_start)
 9. base::stop("'vec' must be sorted non-decreasingly and not contain NAs")
r lubridate
1个回答
0
投票

您的

date2season
功能存在一些不一致/问题:

  1. season_start
    位于
    "%m-%d-%Y"
    中,而您将
    date
    参数格式化为
    "%m%d%Y"
    (无破折号);这确实不是最大的问题,所以我们暂时忽略它。

  2. 您的间隔测试是在字符串上进行的,而不是在日期上进行的,因此它会慢得多且效率低。再说一次,这不会导致您的错误,但这确实不是应该做的。

  3. 因为你的

    "09"-
    中有
    "12"-
    "03"-
    season_start
    、...,无论其他什么,_that 都会减少(即使是字符串)。
    findInterval
    要求其
    vec=
    (第二个)参数为

    vec: numeric, sorted (weakly) increasingly, ...
    

我建议您将数据和季节放入适当的

Date
类,例如:

date2season <- function(date) {
  stopifnot(inherits(date, "Date"))
  season_start <- c("09-01-2021", "12-01-2021", "03-01-2022", "06-01-2022", "09-01-2022", "12-01-2022", "03-01-2023", "06-01-2023", "09-01-2023") # mmdd
  season_start <- as.Date(season_start, format = "%m-%h-%Y")
  season_name <- c("FALL ('21)", "WINTER ('21)", "SPRING ('22)", "SUMMER ('22)", "FALL ('22)", "WINTER ('22)", "SPRING ('23)", "SUMMER ('23)", "FALL ('23)")
  season_name[findInterval(date, season_start)] ##
}
© www.soinside.com 2019 - 2024. All rights reserved.