R如何创建一个新变量,该变量引用另一个数据帧中的特定值

R如何创建一个新变量,该变量引用另一个数据帧中的特定值,r,indexing,time-series,subset,lookup,R,Indexing,Time Series,Subset,Lookup,我试图在不同的观察期内平均生物速率。 开始和结束时间在我的数据帧(df)中,测量的速率在第二个数据帧(速率)中。数据是每小时收集的,但我想说的是每个观察期的平均比率 我的数据集比这个大得多(~10k个观测值),变量也更多,但我希望这个可重复的例子能帮助找到解决方案 ## start and end date-times for observation periods. df<- data.frame(observation = 1:4, start.time= c(as.P

我试图在不同的观察期内平均生物速率。 开始和结束时间在我的数据帧(df)中,测量的速率在第二个数据帧(速率)中。数据是每小时收集的,但我想说的是每个观察期的平均比率

我的数据集比这个大得多(~10k个观测值),变量也更多,但我希望这个可重复的例子能帮助找到解决方案

## start and end date-times for observation periods.  
df<- data.frame(observation = 1:4,
      start.time= c(as.POSIXct("2021-01-01 00:35"), as.POSIXct("2021-01-02 14:35"), as.POSIXct("2021-01-03 07:31"), as.POSIXct("2021-01-04 19:02")),
      end.time = c(as.POSIXct("2021-01-01 12:38"), as.POSIXct("2021-01-02 14:47"), as.POSIXct("2021-01-04 00:54"), as.POSIXct("2021-01-05 05:19")))

## rates observed                      
data = data.frame(time = seq(as.POSIXct("2021-01-01 00:00"), 
                     as.POSIXct("2021-01-05 23:59"), by = "hour"),
                     rate=rnorm(1:120))

观察期的开始和结束日期时间。
df我们可以使用
apply
函数系列。它只是for循环的一个变体。比如说

使用for循环

mean_rate <- c()
for (i in c(1:nrow(df)){
  mean_rate[i] <- mean(data$rate[data$time >= df$start.time[i] & data$time < df$end.time[i]])
}
data$mean_rate <- mean_rate
使用
mapply

df$mean_rate <- sapply(c(1:nrow(df), function(i){
  mean(data$rate[data$time >= df$start.time[i] & data$time < df$end.time[i]])
})
df$mean_rate <- mapply(function(x, y){
  mean(data$rate[data$time >= x & data$time < y])
}, df$start.time, df$end.time)
df$mean_rate=x&数据$time
一个整洁的选择

library(tidyverse)
library(lubridate)

data %>%
  crossing(interval(df$start.time, df$end.time), 
           .name_repair = ~ str_sub(., 1, 8)) %>%
  filter(time %within% interval) %>%
  group_by(interval) %>%
  summarise(meanRate = mean(rate))

# # A tibble: 3 x 2
#   interval                                         meanRate
#   <Interval>                                          <dbl>
# 1 2021-01-01 00:35:00 CET--2021-01-01 12:38:00 CET  -0.0938
# 2 2021-01-03 07:31:00 CET--2021-01-04 00:54:00 CET   0.0360
# 3 2021-01-04 19:02:00 CET--2021-01-05 05:19:00 CET  -0.191 
库(tidyverse)
图书馆(lubridate)
数据%>%
穿越(间隔(df$开始时间,df$结束时间),
.name_repair=~str_sub(,1,8))%>%
筛选器(时间%在%间隔内)%%>%
分组依据(区间)%>%
总结(平均比率=平均(比率))
##tibble:3 x 2
#区间平均利率
#                                             
#2021-01-01 00:35:00 CET--2021-01-01 12:38:00 CET-0.0938
#2021-01-03 07:31:00 CET--2021-01-04 00:54:00 CET 0.0360
#3 2021-01-04 19:02:00 CET--2021-01-05 05:19:00 CET-0.191

这是一个长期的方法对您有效吗?然而,它试图计算区间加权部分的平均值

df%
变异(虚拟=小时(开始时间)=小时(结束时间))%>%
轴长(!c(观察,虚拟))%>%
分组依据(观察)%>%
变异(val2=楼层日期(值,单位为“小时”),
interv=case_when(dummy&name='end.time'~difftime(值、值、单位='secs'),
dummy~difftime(值[name=='end.time'],值[name=='start.time'],单位='secs'),
name=='start.time'~3600-difftime(值,val2,单位='secs'),
TRUE~difftime(值,val2,单位='secs'))%>%
完成(val2=seq.POSIXt(最小值(val2),最大值(val2),by='hours'),fill=list(interv=60*60))%>%
左联合(数据,by=c('val2'='time'))%>%
汇总(平均利率=总和(数字利率)*利率)/总和(数字利率)
#>#tibble:4 x 2
#>观测平均值
#>              
#> 1           1    0.265 
#> 2           2    1.10  
#> 3           3    0.277 
#> 4           4    0.0991

由(v2.0.0)于2021-05-02创建

非常感谢您的建议。循环/应用函数是否对指定的开始和结束时间之间的所有观测值进行平均,还是仅计算开始和结束值之间的平均值?谢谢您的回答!我无法使“交叉”功能正常工作,因此我没有使用此解决方案。@Rnewbie:非常欢迎。为什么
crossing()
不起作用?您收到了什么错误消息?请设置
数据的种子,并包括预期结果或所需的平均值计算方法。事实上,我认为你需要加权平均值,因为时间间隔不是相等的。你还没有接受任何答案。你能澄清一下,如果obs1从01:59:00开始,到02:59:00结束,持续一个小时,那么预期结果是什么吗?但是01:00:00的费率是1,02:00:00的费率是2?预期平均值是(1+2)/2=1.5还是(1*1+2*59)/60=1.98??请澄清