R-如何在同一列中使用每小时不同分钟的值进行计算

时间:2019-02-08 16:59:42

标签: r date posixct

尊敬的Stackoverflow社区,

我有一个日期时间为[posixct'%d。%m。%Y%H:%M']的数据集,传感器的测量值位于[A]和[V]中。 日期时间是一列,其他传感器是另一列,每个传感器都有一列。

我想使用每个传感器列内的值来计算校正值。 修正值应每小时写入一次新的列。 因此,我想按以下方式计算校正:

更正= | x-(0.5 *(y + z))|

x =传感器1的值,如果分钟=='00'

y =传感器1的值,如果分钟=='03'

z =传感器1的值,如果分钟=='06'

我想要的是一个函数,该函数每小时计算一次书面公式,但前提是必须给出小时中所有三分钟(“ 00”和“ 03”和“ 06”)的值并将校正值写到新列(Data $ correction)中。 我希望我能解释一下,我想做什么。

我尝试了几次循环并应用和映射函数,但是日期格式或函数始终存在问题。 这对我来说似乎是最好的方法,尽管它目前尚不起作用,但我希望有一种方法可以使它开始起作用。 我也认为,写出向量并将它们合并在一起以熔解或合并可能不是最好的方法。但是现在我正在苦苦挣扎,现在不解决问题。

我真的希望你能帮助我。非常感谢。

Test_sub <- read.table(file= 'Test_sub.csv',
header=T, sep= ';', dec='.', stringsAsFactors= F)

sensor1_V_0 <- Test_sub[format(Test_sub$Datehour, format = '%M') ==           '00',]
sensor1_V_3 <- Test_sub[format(Test_sub$Datehour, format = '%M') == '03',]
sensor12_V_6 <- Test_sub[format(Test_sub$Datehour, format = '%M') == '06',]

test_sub2<- mapply(function(x, y, z) x-(0.5*(y+z)), sensor1_V_0$sensor1_V,     sensor1_V_3$sensor1_V, sensor1_V_6$sensor1_V)

2 个答案:

答案 0 :(得分:0)

让我们先创建一些虚假数据:

dill<-data.frame(time=seq(as.POSIXct("2019-01-01 11:30"), as.POSIXct("2019-01-01 13:20"), by=180),val=runif(37,0,100))

现在我们可以这样做:

require(tidyverse)
require(lubridate)
dill<- dill %>% 
group_by(hour(time)) %>% # group by the hour -- note this assumes there's only one day in the data, you'll need to adjust this if there's more than one day
filter(any(minute(time)==3) & any(minute(time)==6) & any(minute(time)==0)) %>% # remove any hours in the data that don't have minutes 0, 3 and 6
mutate(correction=abs(val[minute(time)==0]-0.5*(val[minute(time)==3]+val[minute(time)==6]))) # calculate the correction

答案 1 :(得分:0)

数据的示例为:

y <- seq(from= 0.1, to= 0.5, by= 0.1)
min <- as.POSIXct('2018-09-25 09:00:00')
max <- as.POSIXct('2018-09-26 17:45:00')
SEQ <- data.frame(Datehour = seq.POSIXt(min,max, by = 60*03))
str(SEQ)
SEQ <- data.frame(SEQ[format(SEQ, format = '%M') == '00' | 
                                format(SEQ, format = '%M') == '03' |
                                format(SEQ, format = '%M') == '06' |
                                format(SEQ, format = '%M') == '15' |
                            format(SEQ, format = '%M') == '30' |
                            format(SEQ, format = '%M') == '45' ,])

data <- data.frame(Datehour=SEQ, y = 0.1, z= 0.3)