2016-12-24 6 views
0

Мне нужно пропустить кадр данных, прочитать значение трех столбцов (2 метки времени и 1 метка). Затем для этой строки из трех значений мне нужно сравнить с каждой строкой второго блока данных, чтобы увидеть, совпадает ли A) ярлык, и B) временная метка, которая находится во втором фрейме данных, находится между двумя временными метками текущей строки. Если строка действительно соответствует этим двум критериям, она должна быть сохранена в dataframe/vector для дальнейшей обработки.Для каждой строки в фрейме данных, петля через другой фрейм данных

Я пробовал много версий функции x_apply в сочетании с циклом for (для «второй» итерации). Ниже приведена очень упрощенная версия моей проблемы, где я создаю два небольших фрейма и пытаюсь установить требуемый цикл. Значение должно быть сохранено в «x» - и пока это значение отображается, когда я печатаю (x) в цикле, «x» считается NULL после завершения функции приложения. Кажется, что он сбрасывается каждый раз, когда вызывается функция. Принимая во внимание мои требования, есть ли у вас идеи для другого/лучшего подхода? Я не обязан применять само по себе. Заранее большое спасибо!

label <- c("p1", "p1", "p2") 
value_1 <- c(8,4,2) 
value_2 <- c(10,6,9) 
df1 <- data.frame(label, value_1, value_2) 

label <- c("p1", "p2", "p2") 
value_3 <- c(8,8,8) 
df2 <- data.frame(label, value_3) 

x = NULL 

small_function <- function(value_1, value_2, label) { 
    for(i in 1:nrow(df2[df2$label == label,])) { 
    print(i) 
    x <- append(x, i) 
    print(x) 
    } 
} 

apply(df1, 1, function(x,y,z) small_function(df1$value_1, df1$value_2, df1$label)) 
x 

Update: пример с датами времени, что приводит к ошибке «Ожидая одно значение» для меня.

label <- c("p1", "p1", "p2") 
value_1 <- c(as.POSIXct(1482645600, origin="1970-01-01"),as.POSIXct(1482745600, origin="1970-01-01"),as.POSIXct(1482845600, origin="1970-01-01")) 
value_2 <- c(as.POSIXct(1582645600, origin="1970-01-01"),as.POSIXct(1582745600, origin="1970-01-01"),as.POSIXct(1582845600, origin="1970-01-01")) 
df1 <- data.frame(label, value_1, value_2) 
label <- c("p1", "p2", "p2") 
value_3 <- c(as.POSIXct(1582645100, origin="1970-01-01"),as.POSIXct(1582745200, origin="1970-01-01"),as.POSIXct(1582845300, origin="1970-01-01")) 
df2 <- data.frame(label, value_3) 

df_merge = merge(df1, df2, c("label"), suffixes = c(".df1",".df2")) 
setDT(df_merge) 
str(df_merge) 
a <- df_merge[between(value_3, value_1, value_2), ] 
+2

слияния первой а затем примените условия вашего диапазона! –

ответ

1

Это что вы ищите?

library(data.table) 
setDT(df1) 
setDT(df2)  
setkey(df1, label) 
setkey(df2, label) 
df1[df2] # here i merge both the data.table 

df3[between(value_3, value_1, value_2), ] # apply the condition 
# label value_1 value_2 value_3 
#1: p1  8  10  8 
#2: p2  2  9  8 
#3: p2  2  9  8 

с некоторыми датами в данных:

# ensure the dates are in proper formats(i had simulated some sample data with dates. just sharing the last 2 steps output) 
df3$value_1 = as.Date(df3$value_1, format= "%d/%m/%Y") 
df3$value_2 = as.Date(df3$value_2, format= "%d/%m/%Y") 
df3$value_3 = as.Date(df3$value_3, format= "%d/%m/%Y") 
# df3 
# label value_1 value_2 value_3 
#1: p1 2016-03-10 2016-03-20 2016-03-15 
#2: p1 2016-06-17 2016-06-19 2016-03-15 
#3: p2 2016-09-10 2016-09-20 2016-06-21 
#4: p2 2016-09-10 2016-09-20 2016-09-12 

df3[between(value_3, value_1, value_2), ] 
# label value_1 value_2 value_3 
#1: p1 2016-03-10 2016-03-20 2016-03-15 
#2: p2 2016-09-10 2016-09-20 2016-09-12 
+1

Это замечательно! Когда я использую между вызовами значений POSIXct, я тем не менее получаю сообщение об ошибке: «Ошибка: ожидающее единственное значение». Любая идея, как я могу это решить? – WalterB

+1

Ум, разделяющий образцы данных с датами? Я посмотрю на это ... это будет легко исправить. Веселого Рождества ... теперь собираюсь в церковь –

+0

благодарю вас и за чудесное Рождество для вас :) Я отредактировал свой первый вопрос с обновлением, которое содержит еще несколько образцов данных. Большое спасибо за Вашу помощь. – WalterB

1

Вот очень короткое решение в базе R, если это то, что вы ищете:

dfr <- merge(df1, df2, by="label", all=FALSE) 
subset(dfr, value_3 > value_1 & value_3 < value_2) 

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

  • Нет связанных вопросов^_^