Ответ 1
Я, однако, решил проблему, используя >= и <= операторы для сравнения полей start, end и datetime, после разделения данных с помощью split().; match.col = with(d2[[v]], d1$datetime >= d2.start & d1$datetime <= d2.end)
Пользователи Rack StackOverflow -
Мне нужно сопоставить набор различных времен и интервалов времени, определенных в другом кадре данных, с начала и конца. Это приведет к созданию одного кадра данных со многими отношениями.
Упрощенный набор записей для соответствия следующим:
vid start end
17599 7588 2011-02-14 19:00:00 2011-02-14 19:11:00
17601 7588 2011-02-14 19:58:00 2011-02-14 20:43:00
17603 7588 2011-02-14 21:22:00 2011-02-14 22:00:00
И некоторые примеры записей, соответствующие указанным выше данным:
vid datetime
469818 7588 2011-02-14 19:00:10
470747 7588 2011-02-14 19:59:10
470788 7588 2011-02-14 21:23:10
Мне хотелось бы что-то вроде:
vid datetime start end
7588 2011-02-14 19:00:10 2011-02-14 19:00:00 2011-02-14 19:11:00
7588 2011-02-14 19:59:10 2011-02-14 19:58:00 2011-02-14 20:43:00
7588 2011-02-14 21:23:10 2011-02-14 21:22:00 2011-02-14 22:00:00
В моей жизни я не могу понять, как это сделать в R. Любая помощь будет очень признательна. Спасибо!
Я, однако, решил проблему, используя >= и <= операторы для сравнения полей start, end и datetime, после разделения данных с помощью split().; match.col = with(d2[[v]], d1$datetime >= d2.start & d1$datetime <= d2.end)
Воспроизводимый пример:
txt1 <- " vid start end
17599 7588 '2011-02-14 19:00:00' '2011-02-14 19:11:00'
17601 7588 '2011-02-14 19:58:00' '2011-02-14 20:43:00'
17603 7588 '2011-02-14 21:22:00' '2011-02-14 22:00:00'
"
txt2 <- " vid datetime
469818 7588 '2011-02-14 19:00:10'
470747 7588 '2011-02-14 19:59:10'
470788 7588 '2011-02-14 21:23:10'
"
d1 <- read.table(textConnection(txt1), header = TRUE,
colClasses = c("integer","integer","POSIXct","POSIXct"))
d2 <- read.table(textConnection(txt2), header = TRUE,
colClasses = c("integer","integer","POSIXct"))
Мы можем получить индексы (строки) в d1
, которые соответствуют каждой строке d2
, используя:
> idx <- sapply(d2$datetime,
+ function(x, start, end) {which(x > start & x < end)},
+ d1$start, d1$end)
> idx
[1] 1 2 3
И мы можем использовать индексы idx
для привязки элементов d1
к d2
:
> cbind(d2, d1[idx, 2:3])
vid datetime start end
469818 7588 2011-02-14 19:00:10 2011-02-14 19:00:00 2011-02-14 19:11:00
470747 7588 2011-02-14 19:59:10 2011-02-14 19:58:00 2011-02-14 20:43:00
470788 7588 2011-02-14 21:23:10 2011-02-14 21:22:00 2011-02-14 22:00:00