Я новичок в R, поэтому простите меня, если ответ очевиден. Я также пытался найти ответ, но я думаю, что не использую правильные условия.R Статистика: Сравнение временных меток в двух информационных кадрах
У меня есть два dataframes, каждый из которых состоит из DateTime и значение
например, Кадр данных 1:
2003-01-01 10:00:00 | 10
2003-01-02 10:00:00 | 5
2003-01-03 10:00:00 | 7
...<snip>...
2003-06-15 10:00:00 | 4.5
2003-06-16 10:00:00 | 4.5
2003-06-17 10:00:00 | 3.5
...<snip>...
2003-11-21 10:00:00 | 3.5
2003-11-22 10:00:00 | 4
2003-11-23 10:00:00 | 4.5
и кадров данных 2:
2003-01-01 09:00:00 | 2
2003-03-19 12:00:00 | 5
2003-05-14 14:00:00 | 3.5
2003-06-10 14:00:00 | 4
...<snip>...
2003-10-20 14:00:00 | 2
2003-11-22 14:00:00 | 3
Что я хотел бы сделать, это добавить значения вместе, если метка времени в первом dataframe находится в пределах отметки времени второго
eg
2003-01-01 10:00:00 находится между 2003-01-01 09:00:00 и 2003-03-19 12:00:00, поэтому расчет должен быть выполнен 10 + 2.
[Удалено несогласованное утверждение]
Я предполагаю, что в R. есть простой способ сделать это. Как программист, мой первый инстинкт - просто использовать for-loops.
EDIT: То, что я хотел бы что-то вроде ниже
timestamp | measurement | correction | corrected
2003-01-01 10:00:00 | 10 | 2 | 12
2003-01-02 10:00:00 | 5 | 2 | 7
2003-01-03 10:00:00 | 7 | 2 | 9
...<snip>...
2003-06-15 10:00:00 | 4.5 | 4 | 8.5
2003-06-16 10:00:00 | 4.5 | 4 | 8.5
2003-06-17 10:00:00 | 3.5 | 4 | 7.5
...<snip>...
2003-11-21 10:00:00 | 3.5 | 2 | 5.5
2003-11-22 10:00:00 | 4 | 2 | 6
2003-11-23 10:00:00 | 4.5 | 3 | 7.5
Действительно важная вещь получает скорректированное значение. У меня есть (вроде) работающий в нескольких циклах for-loops, но я хочу иметь возможность сделать это «R».
Time from DF1 Time from DF2 Calculation
2003-11-21 10:00:00 >= 2003-10-20 14:00:00 = 3.5 + 2
2003-11-22 10:00:00 >= 2003-10-20 14:00:00 = 4 + 2
2003-11-23 10:00:00 >= 2003-11-22 14:00:00 = 4.5 + 3
EDIT 2:
Я получил это работает с петлей. Есть ли лучший способ сделать это?
library(plyr)
library(lubridate)
df_measurements <- read.table(text = "
2003-01-01 10:00:00 | 10
2003-01-02 10:00:00 | 5
2003-01-03 10:00:00 | 7
2003-06-15 10:00:00 | 4.5
2003-06-16 10:00:00 | 4.5
2003-06-17 10:00:00 | 3.5
2003-11-21 10:00:00 | 3.5
2003-11-22 10:00:00 | 4
2003-11-23 10:00:00 | 4.5", sep = "|")
df_corrections <- read.table(text = "
2003-01-01 09:00:00 | 5.5
2003-05-01 09:00:00 | 6
2003-08-01 09:00:00 | 8", sep = "|")
#Create named columns and remove unneeded
df_measurements$time <- ymd_hms(df_measurements$V1)
df_measurements$obs <- df_measurements$V2
df_measurements$V1 <- NULL
df_measurements$V2 <- NULL
df_corrections$time <- ymd_hms(df_corrections$V1)
df_corrections$offset <- df_corrections$V2
df_corrections$V1 <- NULL
df_corrections$V2 <- NULL
#Get number of corrections
c_length <- nrow(df_corrections)
#Create blank data frame to merge results into
result <- data.frame(time=as.Date(character()), obs=numeric(), correction=numeric(), corrected=numeric(), stringsAsFactors=FALSE)
for(i in c(1:c_length)) {
if(i < c_length) {
subset_m <- df_measurements[df_measurements$time >= df_corrections$time[[i]] & df_measurements$time < df_corrections$time[[i+1]], ]
} else {
#Last correction in correction data frame
subset_m <- df_measurements[df_measurements$time >= df_corrections$time[[i]], ]
}
#Make "correction" column and fill with correction to be used
subset_m[, "correction"] <- rep(df_corrections$offset[[i]], nrow(subset_m))
#Make "corrected" column and fill with corrected value
subset_m$corrected <- subset_m$correction + subset_m$obs
#Combine subset with result
result <- rbind(result, subset_m)
}
print(result)
Я все еще не понимаю, что вы хотите. откуда взялись '2003-05-01 09: 00: 00'? – JackeJR
«последние три записи после последнего datetime в DataFrame 2». Каким образом 2003-11-21 10:00:00 и 2003-11-22 10:00:00 приходят после 2003-11-22 14:00:00? С другой стороны, 2003-11-23 10:00:00 наступает после 2003-11-22 14:00:00. Но теперь правило «+5» не применяется, а вместо этого добавляется 3. Пожалуйста, уточните свой вопрос и убедитесь, что ваши примеры соответствуют. – Henrik
@Henrik Я думаю, вы смотрите на него неправильно. 2003-10-20 14:00:00 < – ConnectedSystems