每小时积分(行数)
integrate by every hour (number of rows)
我有 date_time 字段,其中包含一个分钟范围(第一分钟,第二分钟..)。
我想每小时积分 theMass
。
我必须通过 vs
和 t_in
每小时的平均值(theMass 取决于 t_in 并与 vs 对比)才能进行正确的计算。
代码给了我 24 个结果(每小时一个积分)但是你可以看到结果是线性增加的,这是不对的。
所以,我不确定我的计算结果,或者是否有其他方法可以实现。
library(tidyverse)
library(Bolstad2)
thelength = 1440
date_time <- seq(1, thelength)
fo <- runif(thelength, 1000, 3000)
vs <- runif(thelength, 0, 16)
t_in <- runif(thelength, 0, 150)
A3 <- 1.998201136e-10
A2 <- -1.467393126e-07
A1 <- -0.000681555
A0 <- 1.010255780
dens <- 0.9859
# Mass in kgr/h
theMass <- fo * dens * (A3 * (t_in ^ 3) + A2 * (t_in ^ 2) + A1 * t_in + A0)
df <- data.frame(date_time, fo, vs, t_in, theMass)
# because date_time is by 1 min, we want
# to integrate every hour, so by 60 values
df <- df %>%
group_by(cut(date_time, breaks = seq(0, thelength, by = 60))) %>%
summarise_at(vars(t_in, vs), mean, na.rm = TRUE)
df <- na.omit(df)
per_hour <- 60
hours <- dim(df)[1]
# result of integration
integration <- vector('list', hours)
# Mass for first hour
theMass_1 <- fo * dens * (A3 * (df$t_in[1] ^ 3) +
A2 * (df$t_in[1] ^ 2) +
A1 * df$t_in[1] + A0)
# integration for 1 hour
integration[[1]] <- sintegral(date_time[1:length(seq(1, per_hour))],
theMass_1[1:length(seq(1, per_hour))])
# integration for the rest hours
for (i in 2:hours)
{
# add 60 minutes at every hour loop
if (i > 2)
{
per_hour <- 60 + per_hour
}
# integrate by every hour
integration[[i]] <- sintegral(date_time[1:length(seq(per_hour, 2 * per_hour))],
theMass[1:length(seq(per_hour, 2 * per_hour))])
}
# the result should hold only the integration value for every hour
result <- c()
for (i in 1:length(integration))
{
result[i] <- integration[[i]]$int
}
result
问题出在 1:length(seq(per_hour, 2 * per_hour))
,它随着 per_hour
的增加而变长,并且总是从 1 开始。
我认为在您的循环中您需要 per_hour + 1:60
。或者只是 (i-1)*60 + 1:60
我有 date_time 字段,其中包含一个分钟范围(第一分钟,第二分钟..)。
我想每小时积分 theMass
。
我必须通过 vs
和 t_in
每小时的平均值(theMass 取决于 t_in 并与 vs 对比)才能进行正确的计算。
代码给了我 24 个结果(每小时一个积分)但是你可以看到结果是线性增加的,这是不对的。
所以,我不确定我的计算结果,或者是否有其他方法可以实现。
library(tidyverse)
library(Bolstad2)
thelength = 1440
date_time <- seq(1, thelength)
fo <- runif(thelength, 1000, 3000)
vs <- runif(thelength, 0, 16)
t_in <- runif(thelength, 0, 150)
A3 <- 1.998201136e-10
A2 <- -1.467393126e-07
A1 <- -0.000681555
A0 <- 1.010255780
dens <- 0.9859
# Mass in kgr/h
theMass <- fo * dens * (A3 * (t_in ^ 3) + A2 * (t_in ^ 2) + A1 * t_in + A0)
df <- data.frame(date_time, fo, vs, t_in, theMass)
# because date_time is by 1 min, we want
# to integrate every hour, so by 60 values
df <- df %>%
group_by(cut(date_time, breaks = seq(0, thelength, by = 60))) %>%
summarise_at(vars(t_in, vs), mean, na.rm = TRUE)
df <- na.omit(df)
per_hour <- 60
hours <- dim(df)[1]
# result of integration
integration <- vector('list', hours)
# Mass for first hour
theMass_1 <- fo * dens * (A3 * (df$t_in[1] ^ 3) +
A2 * (df$t_in[1] ^ 2) +
A1 * df$t_in[1] + A0)
# integration for 1 hour
integration[[1]] <- sintegral(date_time[1:length(seq(1, per_hour))],
theMass_1[1:length(seq(1, per_hour))])
# integration for the rest hours
for (i in 2:hours)
{
# add 60 minutes at every hour loop
if (i > 2)
{
per_hour <- 60 + per_hour
}
# integrate by every hour
integration[[i]] <- sintegral(date_time[1:length(seq(per_hour, 2 * per_hour))],
theMass[1:length(seq(per_hour, 2 * per_hour))])
}
# the result should hold only the integration value for every hour
result <- c()
for (i in 1:length(integration))
{
result[i] <- integration[[i]]$int
}
result
问题出在 1:length(seq(per_hour, 2 * per_hour))
,它随着 per_hour
的增加而变长,并且总是从 1 开始。
我认为在您的循环中您需要 per_hour + 1:60
。或者只是 (i-1)*60 + 1:60