使用开始和结束时间从单独的数据框中提取值
Use start and end time to extract values from separate dataframe
我在 R 中解决了很多统计和数据库问题,并且是一个新用户,但我还没有弄清楚循环和编程。我被这个困住了,只是想不通。我有一个具有开始日期和结束日期以及值 TP(总磷)的数据框。
begin = c("2015/11/16 17:45", "2015/11/17 17:45", "2015/11/18 17:45", "2015/11/19 17:45", "2015/11/20 17:45", "2015/11/21 17:45")
end = c("2015/11/17 17:45", "2015/11/18 17:45", "2015/11/19 17:45", "2015/11/20 17:45", "2015/11/21 17:45", "2015/11/22 17:45")
bottle = c(1, 2, 3, 4, 5, 6)
tp = c(10, 200, 100, 73, 38, 50)
data=data.frame(begin, end, bottle, tp)
我需要根据每行的开始和结束日期,将 TP 乘以另一个数据框中的值之和。另一个数据框是下面的缩短版本....
set.seed(1)
time = seq.POSIXt(from=as.POSIXct('2015-11-15',tz=''),
to=as.POSIXct('2016-11-25',tz=''),
by = as.difftime(0.25,units="hours"))
level_m= runif(n = length(time), min = .01, max = .06)
time <- as.data.frame(time)
level_m <- as.data.frame(level_m)
# as dataframe
water_level <- cbind(time, level_m)
我想为第一个名为 data 的数据框的每一行执行此操作。我尝试过的是使用一种数据库方法,其中两个数据帧被合并和聚合,但它并不真正令人满意,因为最后一个值会总结太多数据,而不仅仅是我需要的范围......而且它做的比我真正需要的更多.
rng <- cut(water_levle$time,
breaks=c(data$begin, max(data$end)),
include.lowest=T)
test <- aggregate(cbind(count=1, sum=water_level$level_m)~rng, FUN=sum)
我希望我做对了,因为这是我在这里提出的第一个问题。谢谢,比尔
首先好 post,您让重现数据变得容易。
我认为以下是您要查找的内容。它将指定日期 运行ge 中的 m_level
相加,然后将 t 乘以 tp。 level.sum
是一个中介,为了清楚起见,我把它留在了数据框中。
for( n in 1:nrow(data)){
#Defined here for clarify in the subset
begin_d <- as.Date(data[n,'begin'])
end_d <- as.Date(data[n,'end'])
time_d <- as.Date(water_level$time)
data[n,'level.sum'] <- sum(water_level[time_d>=begin_d & time_d<=end_d, "level_m"])
data[n,'tp.mult.sum']<- (data[n,"tp"]*data[n,"level.sum"])
}
我将其编辑为不使用 subset(),因为它仅供交互使用。
一般说明:使用像 dataframe['selection criteria','column name']
这样的代码选择数据框的元素是一个有用的工具。
我 运行 它而不是你拥有的最终代码块,它似乎 运行 正确。
不是在 data$begin
中定位 water_level$time
,相反,将给出每个 data$begin
(和 data$end
)在 water_level$time
中出现的位置:
#convert to date-time
data$begin = as.POSIXct(data$begin)
data$end = as.POSIXct(data$end)
from = findInterval(data$begin, water_level$time)
to = findInterval(data$end, water_level$time)
from
#[1] 168 264 360 456 552 648
to
#[1] 264 360 456 552 648 744
#e.g. `water_level$time[168:264]` is ` >= data$begin[1]` and ` <= data$end[1]` etc
并且 - 假设 nrow(data)
and/or to - from
不是很大 - 我们可以简单地遍历每个 from:to
以找到 [=20= 的相应总和]:
mapply(function(begin, end, level) sum(level[begin:end]),
from,
to,
MoreArgs = list(level = water_level$level))
#[1] 3.495112 3.182623 3.419295 3.466763 3.504436 3.450281
#and multiply
#... * data$tp
我在 R 中解决了很多统计和数据库问题,并且是一个新用户,但我还没有弄清楚循环和编程。我被这个困住了,只是想不通。我有一个具有开始日期和结束日期以及值 TP(总磷)的数据框。
begin = c("2015/11/16 17:45", "2015/11/17 17:45", "2015/11/18 17:45", "2015/11/19 17:45", "2015/11/20 17:45", "2015/11/21 17:45")
end = c("2015/11/17 17:45", "2015/11/18 17:45", "2015/11/19 17:45", "2015/11/20 17:45", "2015/11/21 17:45", "2015/11/22 17:45")
bottle = c(1, 2, 3, 4, 5, 6)
tp = c(10, 200, 100, 73, 38, 50)
data=data.frame(begin, end, bottle, tp)
我需要根据每行的开始和结束日期,将 TP 乘以另一个数据框中的值之和。另一个数据框是下面的缩短版本....
set.seed(1)
time = seq.POSIXt(from=as.POSIXct('2015-11-15',tz=''),
to=as.POSIXct('2016-11-25',tz=''),
by = as.difftime(0.25,units="hours"))
level_m= runif(n = length(time), min = .01, max = .06)
time <- as.data.frame(time)
level_m <- as.data.frame(level_m)
# as dataframe
water_level <- cbind(time, level_m)
我想为第一个名为 data 的数据框的每一行执行此操作。我尝试过的是使用一种数据库方法,其中两个数据帧被合并和聚合,但它并不真正令人满意,因为最后一个值会总结太多数据,而不仅仅是我需要的范围......而且它做的比我真正需要的更多.
rng <- cut(water_levle$time,
breaks=c(data$begin, max(data$end)),
include.lowest=T)
test <- aggregate(cbind(count=1, sum=water_level$level_m)~rng, FUN=sum)
我希望我做对了,因为这是我在这里提出的第一个问题。谢谢,比尔
首先好 post,您让重现数据变得容易。
我认为以下是您要查找的内容。它将指定日期 运行ge 中的 m_level
相加,然后将 t 乘以 tp。 level.sum
是一个中介,为了清楚起见,我把它留在了数据框中。
for( n in 1:nrow(data)){
#Defined here for clarify in the subset
begin_d <- as.Date(data[n,'begin'])
end_d <- as.Date(data[n,'end'])
time_d <- as.Date(water_level$time)
data[n,'level.sum'] <- sum(water_level[time_d>=begin_d & time_d<=end_d, "level_m"])
data[n,'tp.mult.sum']<- (data[n,"tp"]*data[n,"level.sum"])
}
我将其编辑为不使用 subset(),因为它仅供交互使用。
一般说明:使用像 dataframe['selection criteria','column name']
这样的代码选择数据框的元素是一个有用的工具。
我 运行 它而不是你拥有的最终代码块,它似乎 运行 正确。
不是在 data$begin
中定位 water_level$time
,相反,将给出每个 data$begin
(和 data$end
)在 water_level$time
中出现的位置:
#convert to date-time
data$begin = as.POSIXct(data$begin)
data$end = as.POSIXct(data$end)
from = findInterval(data$begin, water_level$time)
to = findInterval(data$end, water_level$time)
from
#[1] 168 264 360 456 552 648
to
#[1] 264 360 456 552 648 744
#e.g. `water_level$time[168:264]` is ` >= data$begin[1]` and ` <= data$end[1]` etc
并且 - 假设 nrow(data)
and/or to - from
不是很大 - 我们可以简单地遍历每个 from:to
以找到 [=20= 的相应总和]:
mapply(function(begin, end, level) sum(level[begin:end]),
from,
to,
MoreArgs = list(level = water_level$level))
#[1] 3.495112 3.182623 3.419295 3.466763 3.504436 3.450281
#and multiply
#... * data$tp