【问题标题】:select data and take a mean based on date and time span from another dataframe选择数据并根据另一个数据框的日期和时间跨度取平均值
【发布时间】:2022-12-19 01:10:48
【问题描述】:

我有个问题。所以,我有两个数据框,其中一个有我进行特定测量的日期和时间。测量时间为一小时。基于该日期和时间,我想从该时间跨度的另一个数据框中获取 VPD 列的平均值。意味着我需要采用 VPD 列的方法,从数据框 testtime 开始,一小时后结束。这意味着 VPD 然后我想添加到 testdataframe。另一个问题是第一个数据帧使用 5 分钟的步长,而第二个数据帧使用 10 分钟的步长。

这是包含有关我的测量信息的数据框:

test <- structure(list(treatment = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 
 2L, 2L, 2L, 2L), levels = c("A", "B"), class = "factor"), plot = structure(c(1L, 
2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L), levels = c("1", "2", "3", 
"4", "5"), class = "factor"), date = structure(c(19028, 19028, 
 19033, 19035, 19038, 19033, 19046, 19046, 19035, 19038), class = "Date"), 
 time = c("11:05:00", "14:20:00", "13:20:00", "12:40:00", 
"10:55:00", "10:45:00", "14:45:00", "12:30:00", "10:45:00", 
"13:25:00")), row.names = c(NA, -10L), class = "data.frame")

这个数据框包含 10 分钟步长的天气数据:

test2 <- structure(list(datetime = structure(c(1644055200, 1644055800, 
 1644056400, 1644057000, 1644057600, 1644058200, 1644058800, 1644059400, 
 1644060000, 1644060600, 1644061200, 1644061800, 1644062400, 1644063000, 
 1644063600, 1644064200, 1644064800, 1644065400, 1644066000, 1644066600, 
 1644067200, 1644067800, 1644068400, 1644069000, 1644069600, 1644070200, 
 1644070800, 1644071400, 1644072000, 1644072600, 1644073200, 1644073800, 
 1644074400, 1644075000, 1644075600, 1644076200, 1644076800, 1644077400, 
 1644078000, 1644078600, 1644079200, 1644079800, 1644080400, 1644081000, 
 1644081600, 1644082200, 1644082800, 1644083400, 1644084000), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), VPD = c(2.02, 2.02, 2.16, 2.18, 2.17, 
 2.17, 2.29, 2.35, 2.35, 2.43, 2.53, 2.69, 2.8, 2.98, 3.34, 3.66, 
 3.73, 3.74, 3.2, 3.25, 3.29, 3.27, 3.24, 3.28, 3.29, 3.31, 3.6, 
 3.74, 3.62, 3.38, 3.22, 3.15, 3.16, 3.11, 3.14, 3, 2.94, 3.02, 
 2.97, 3.01, 2.89, 2.79, 2.83, 2.85, 2.91, 2.94, 2.84, 2.87, 2.75
)), row.names = c(NA, -49L), class = "data.frame")

如果有人知道如何处理这个问题,我将不胜感激!

已编辑- 更改了 test2 数据框

【问题讨论】:

  • test 的第一次观察从 11:05 开始。您希望在test2 中匹配哪个时期? 11:00-12:00、11:10-12:10 或 11:10-12:00 中的任何一个都可能是合理的。
  • 我会四舍五入,从 11:00 开始

标签: r


【解决方案1】:

test2 数据和test 数据在时间上不匹配(test 有 2022 年的观测值,test2 有 2005 年的观测值),但假设两个数据框中都有相应的条目,你应该能够做这样的事情:

library(dplyr)
library(lubridate)
test <- test %>% 
  mutate(date_time = ymd_hms(paste(as.character(date), time)))

test$meanVPD <- sapply(test$date_time, function(t){
  mins <- gsub(".*:(\d{2}):00$", "\1", as.character(t))
  if(grepl("5$", mins)){
    t <- t-minutes(5)
  }
  test2 %>% 
    filter(datetime >= t & datetime <= t+hours(1)) %>% 
    select(VPD) %>% 
    pull %>% 
    mean
}

【讨论】:

  • 哦,对不起,我有一个转换错误,现在更正了test2的日期。不幸的是,这个答案对我不起作用,它告诉我缺少一个括号,但我找不到合适的位置来关闭它
  • 好的,只需要在末尾添加右括号,现在就可以了!非常感谢戴夫! :)
猜你喜欢
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多