Имам два кадъра с данни ev1 и ev2, описващи времеви отпечатъци на два типа събития, събрани в много тестове. И така, всеки кадър с данни има колони "test_id" и "timestamp". Това, което трябва да намеря, е минималното разстояние на ev1 за всеки ev2, в същия тест.
Имам работещ код, който обединява двата набора от данни, изчислява разстоянията и след това използва dplyr за филтриране за минималното разстояние:
ev1 = data.frame(test_id = c(0, 0, 0, 1, 1, 1), time=c(1, 2, 3, 2, 3, 4))
ev2 = data.frame(test_id = c(0, 0, 0, 1, 1, 1), time=c(6, 1, 8, 4, 5, 11))
data <- merge(ev2, ev1, by=c("test_id"), suffixes=c(".ev2", ".ev1"))
data$distance <- data$time.ev2 - data$time.ev1
min_data <- data %>%
group_by(test_id, time.ev2) %>%
filter(abs(distance) == min(abs(distance)))
Въпреки че това работи, частта за сливане е много бавна и се чувства неефективна -- генерирам огромна таблица с всички комбинации от ev2->ev1 за същия test_id, само за да я филтрирам до едно. Изглежда, че трябва да има начин за "филтриране в движение", по време на сливането. Е там?
Актуализация: Следният случай с две колони „групиране по“ е неуспешен, когато се използва подход data.table, описан от akrun:
ev1 = data.frame(test_id = c(0, 0, 0, 1, 1, 1), time=c(1, 2, 3, 2, 3, 4), group_id=c(0, 0, 0, 1, 1, 1))
ev2 = data.frame(test_id = c(0, 0, 0, 1, 1, 1), time=c(5, 6, 7, 1, 2, 8), group_id=c(0, 0, 0, 1, 1, 1))
setkey(setDT(ev1), test_id, group_id)
DT <- ev1[ev2, allow.cartesian=TRUE][,distance:=abs(time-i.time)]
Грешка в eval(expr, envir, enclos): обектът „i.time“ не е намерен
left_join(ev2,ev1, by=c("test_id") )
вместоmerge
? - person Khashaa   schedule 14.12.2014data.table
. Трябва да е много бързо. - person akrun   schedule 14.12.2014dplyr
аналогът наmerge(., all.x=TRUE)
. - person Khashaa   schedule 14.12.2014