R如何创建一个新变量,该变量引用另一个数据帧中的特定值
我试图在不同的观察期内平均生物速率。 开始和结束时间在我的数据帧(df)中,测量的速率在第二个数据帧(速率)中。数据是每小时收集的,但我想说的是每个观察期的平均比率 我的数据集比这个大得多(~10k个观测值),变量也更多,但我希望这个可重复的例子能帮助找到解决方案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
## 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??请澄清