R - Как рассчитать со значениями по разным минутам в час в пределах одного столбца - PullRequest
0 голосов
/ 08 февраля 2019

Уважаемое сообщество Stackoverflow,

У меня есть набор данных с датами времени [posixct '% d.% M.% Y% H:% M'] и измерениями датчиков в [A] и [V].Datetime - это один столбец, а другие датчики - это другие столбцы, по одному столбцу для каждого датчика.

Я хотел бы рассчитать значение коррекции со значениями в столбце каждого датчика.Значение коррекции должно записываться в новый столбец каждый час.Поэтому я хотел бы рассчитать коррекцию следующим образом:

коррекция = | x - (0,5 * (y + z)) |

x = значение датчика 1, если минута =='00'

y = значение датчика 1, если минута == '03'

z = значение датчика 1, если минута == '06'

ЧтоЯ хотел бы иметь функцию, которая вычисляет записанную формулу для каждого часа, но только если дано значение для всех трех минут ('00' & '03' & '06') в часе и выписатьзначение коррекции в новый столбец (Data $ коррекция).Я надеюсь, что смогу объяснить, что я хотел бы сделать.

Я пробовал несколько циклов и применял и отображал функции, но всегда была проблема с форматом даты или функцией.Это то, что мне кажется лучшим подходом, хотя сейчас он не работает, но я надеюсь, что есть способ заставить его начать работать.Также я думаю, что выписывание векторов и слияние их с расплавлением или слиянием может быть не лучшим способом.но сейчас я только борюсь, а не сейчас, как решить проблему.

Очень надеюсь, что вы мне поможете.Большое спасибо.

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 голосов
/ 08 марта 2019

Примером данных будет:

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)
0 голосов
/ 11 февраля 2019

Давайте начнем с создания поддельных данных:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...