Подсчет наблюдений в диапазоне дат R
Вероятно, это действительно простое решение. У меня есть два набора данных. Один - это вектор временных меток твитов POSIXct, а второй - вектор временных меток POSIXct ADL HEAT Map.
Я хочу создать функцию, которая позволяет мне брать даты из вектора твитов и для каждого из них подсчитывать количество временных меток в векторе ADL HEAT Map, которые попадают в указанный диапазон из твита.
Моя цель - создать такую функцию, чтобы я мог вставить вектор твитов, вектор ADL, количество дней из вектора твитов, чтобы начать подсчет, и количество дней из вектора твитов, чтобы прекратить подсчет, и вернуть вектор of считает ту же длину, что и данные твитов.
Я уже пробовал решение здесь, и оно не сработало: подсчитать количество появлений в диапазоне дат в R
Вот пример того, что я пытаюсь сделать. Вот уменьшенная версия наборов данных, которые я использую:
tweets <- c("2016-12-12 14:34:00 GMT", "2016-12-5 17:20:06 GMT")
ADLData <- c("2016-12-11 16:30:00 GMT", "2016-12-7 18:00:00 GMT", "2016-12-2 09:10:00 GMT")
Я хочу создать функцию, назовем ее, countingfunctionкоторая позволяет мне вводить первый набор данных, второй и вызывать количество дней, чтобы оглянуться назад. В этом примере я выбрал 7 дней:
countingfunction(tweets, ADLData, 7)
В идеале это должно было бы вернуть вектор длины tweetsили, в данном случае, 2 со счетчиками для каждого из того, сколько событий ADLDataпроизошло в течение последних 7 дней с даты в tweets. В этом случае c(2,1).
Ответы
Итак, если я правильно вас понял, у вас есть такие данные:
tweets <- c(as.POSIXct("2020-08-16", tz = ""), as.POSIXct("2020-08-15", tz = ""), as.POSIXct("2020-08-14", tz = ""), as.POSIXct("2020-08-13", tz = ""))
ADL <- c(as.POSIXct("2020-08-15", tz = ""), as.POSIXct("2020-08-14", tz = ""))
И вы хотите сказать, находится ли твит в диапазоне дат ADL или нет. Этого можно добиться, выполнив следующие действия:
ifelse(tweets %in% ADL, print("its in"), print("its not"))
Вы можете легко назначить это другому вектору, который затем укажет, включен он или нет.
Вы можете писать countingfunctionс помощью outerи вычислять разницу во времени между каждым значением двух векторов, используя difftime.
countingfunction <- function(x1, x2, n) {
mat <- outer(x1, x2, difftime, units = 'days')
rowSums(mat > 0 & mat <= n)
}
Предполагая, что у вас есть такие векторы класса POSIXct:
tweets <- as.POSIXct(c("2016-12-12 14:34:00", "2016-12-5 17:20:06"), tz = 'GMT')
ADLData <- as.POSIXct(c("2016-12-11 16:30:00","2016-12-7 18:00:00",
"2016-12-2 09:10:00"), tz = 'GMT')
n <- 7
Вы можете передать их как:
countingfunction(tweets, ADLData, n)
#[1] 2 1