【问题标题】:Create a column that lists factor levels between dates listed in another column创建一个列,列出另一列中列出的日期之间的因子水平
【发布时间】:2023-02-02 13:28:24
【问题描述】:

我正在处理一些时间序列数据,并试图根据另一列中的日期添加一个显示“高峰”或“非高峰”的列。我正在尝试使用 dplyr 将它放入管道中。

这是我的代码:

fish_comp_small<- read.csv('Fish composition dai data 2020-21 (small fish).csv') %>%
  mutate(Date_time_S = as.POSIXct(paste(as.Date(as.character(Date_S),"%Y-%m-%d"), Time_S, sep=" "),format = "%Y-%m-%d %H:%M", tz="Asia/Bangkok")) %>%
  mutate(Date_time_E = as.POSIXct(paste(as.Date(as.character(Date_E),"%Y-%m-%d"), Time_E, sep=" "),format = "%Y-%m-%d %H:%M", tz="Asia/Bangkok"))

我只需要创建一个新列,其中“峰值”将在日期“2020-11-27”和“2020-11-28”之间以及“2020-12-24”和“2020-12-”之间排成一行25'。我想在其他任何地方都说“非高峰期”。我试过使用 if_else 没有成功。

这是代表数据:

df<- structure(list(Trip = c("T2", "T2", "T2", "T2", "T2", "T2", "T2", 
"T2", "T2", "T2"), dai_name = c("3C", "3C", "3C", "3C", "3C", 
"3C", "3C", "3C", "3C", "3C"), sampleID = c("S01", "S01", "S01", 
"S01", "S01", "S01", "S01", "S01", "S01", "S01"), Date_S = c("2020-11-27", 
"2020-11-27", "2020-11-28", "2020-11-28", "2020-12-15", "2020-12-15", 
"2020-12-24", "2020-12-25", "2021-01-07", "2021-01-23"), Time_S = c("8:22:00", 
"8:22:00", "8:22:00", "8:22:00", "8:22:00", "8:22:00", "8:22:00", 
"8:22:00", "8:22:00", "8:22:00"), Date_E = c("2020-11-27", "2020-11-27", 
"2020-11-28", "2020-11-28", "2020-12-15", "2020-12-15", "2020-12-24", 
"2020-12-25", "2021-01-07", "2021-01-23"), Time_E = c("10:35:00", 
"10:35:00", "10:35:00", "10:35:00", "10:35:00", "10:35:00", "10:35:00", 
"10:35:00", "10:35:00", "10:35:00"), Total.Catch.per.haul.kg. = c(5.9, 
5.9, 5.9, 5.9, 5.9, 5.9, 5.9, 5.9, 5.9, 5.9), Subsample.kg. = c(5.02, 
5.02, 5.02, 5.02, 5.02, 5.02, 5.02, 5.02, 5.02, 5.02), ScientificName = c("Pangasius.larnaudii", 
"Crossocheilus.atritimess", "Syncrossus.helodes", "Yasuhikotakia.eos", 
"Yasuhikotakia.modesta", "Amblyrhynchichthys.micracanthus", "Crossocheilus.reticulatus", 
"Pangasius.conchophilus", "Phalacronotus.sp1", "Coilia.lindmani"
), Abundance = c(2L, 1L, 1L, 1L, 1L, 4L, 4L, 1L, 1L, 6L), Weight.g. = c(224.9, 
2.7, 16, 9.5, 4.4, 97.9, 7.4, 3.1, 28.8, 44.5), note = c("Sampling", 
"Sampling", "Sampling", "Sampling", "Sampling", "Sampling", "Sampling", 
"Sampling", "Sampling", "Sampling"), Date_time_S = structure(c(1606440120, 
1606440120, 1606440120, 1606440120, 1606440120, 1606440120, 1606440120, 
1606440120, 1606440120, 1606440120), class = c("POSIXct", "POSIXt"
), tzone = "Asia/Bangkok"), Date_time_E = structure(c(1606448100, 
1606448100, 1606448100, 1606448100, 1606448100, 1606448100, 1606448100, 
1606448100, 1606448100, 1606448100), class = c("POSIXct", "POSIXt"
), tzone = "Asia/Bangkok")), row.names = c(NA, 10L), class = "data.frame")

【问题讨论】:

  • 您有多个日期列 - 您希望以哪一个为峰值/非峰值?
  • 哦,对了,忘记删/具体了。日期 S 或日期。为此将忽略“Date_time”列

标签: r dplyr tidyverse lubridate


【解决方案1】:

尝试以下 lubridate 解决方案并首先创建“峰值”间隔,然后使用 ifelse() 语句检查 Date_S 的任一间隔:

library(lubridate)
# create peak intervals
peak1 <- interval(ymd("2020-11-27"), ymd("2020-11-28"))
peak2 <- interval(ymd("2020-12-24"), ymd("2020-12-25"))

# convert character date columns to date formats (lubridate)
dts <- c("Date_S", "Date_E")
df[dts] <- lapply(df[dts], ymd)

#determine peak/notpeak using ifelse
df$peak <- ifelse(df$Date_S %within% peak1 | df$Date_S %within% peak2, 
                  "Peak", "Not Peak")

输出(仅相关列)

# > df[,c("Date_S", "peak")]
#        Date_S     peak
# 1  2020-11-27     Peak
# 2  2020-11-27     Peak
# 3  2020-11-28     Peak
# 4  2020-11-28     Peak
# 5  2020-12-15 Not Peak
# 6  2020-12-15 Not Peak
# 7  2020-12-24     Peak
# 8  2020-12-25     Peak
# 9  2021-01-07 Not Peak
# 10 2021-01-23 Not Peak

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多