2013-08-26 2 views
0

Я новичок в 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) 
+0

Я все еще не понимаю, что вы хотите. откуда взялись '2003-05-01 09: 00: 00'? – JackeJR

+0

«последние три записи после последнего 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

+0

@Henrik Я думаю, вы смотрите на него неправильно. 2003-10-20 14:00:00 < – ConnectedSystems

ответ

0

NB: этот ответ относится к оригинальной вопрос, который был отредактирован после того как я отправил рабочий ответ

Является ли это то, что вы хотите?

df <- 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", sep = "|") 
df$time <- as.POSIXct(df$V1) 

df2 <- read.table(text = "2003-01-01 09:00:00 | 2 
2003-05-01 09:00:00 | 5", sep = "|") 
df2$time <- as.POSIXct(df2$V1) 

df$val <- with(df, ifelse(df$time >= df2$time[1] & df$time <= df2$time[2], df$V2 + 2, df$V2 + 5)) 
+0

Содержание данных - всего лишь пример. Да, ваш ответ будет работать, но только если я захочу сравнить DataFrame 1 с двумя временными метками. Я отредактирую свой вопрос, чтобы сделать то, что я хочу, яснее – ConnectedSystems

+0

@Takuya Я ответил на исходный вопрос, который вы опубликовали, и по мере того, как вы пишете мой ответ, он работал.Я расстраиваюсь, что вы меняете вопрос после того, как я потратил время на предоставление рабочего ответа. Не круто! Это, конечно, не поведение, которое побудит людей помочь вам. – Henrik

+0

Мне жаль, что ты так себя чувствуешь, и я действительно ценю время, которое люди потратили на меня. Тем не менее, ваш ответ был только технически правильным, поскольку он будет работать только при сравнении с двумя переменными. Кроме того, единственное изменение в вопросе, который я задал, - увеличить размер выборки данных примера, чтобы прояснить вопрос. Вы против людей, разъясняющих вопрос, который они задают? – ConnectedSystems

Смежные вопросы