Observações de contagem dentro do intervalo de datas R

Aug 16 2020

Isso provavelmente tem uma solução muito simples. Eu tenho dois conjuntos de dados. Um é um vetor de timestamps de tweet POSIXct e o segundo é um vetor de timestamps POSIXct ADL HEAT Map.

Estou procurando construir uma função que me permita pegar as datas do vetor de tweets e, para cada uma, contar o número de carimbos de data/hora no vetor ADL HEAT Map que caia dentro de um intervalo especificado do tweet.

Meu objetivo é construir a função de forma que eu possa colocar no vetor de tweets, o vetor ADL, o número de dias do vetor de tweets para começar a contar e o número de dias do vetor de tweets para parar de contar e retornar um vetor de contagens com o mesmo comprimento que os dados dos tweets.

Já tentei a solução aqui, e não funcionou: Contar número de ocorrências no intervalo de datas no R

Aqui está um exemplo do que estou tentando fazer. Aqui está uma versão menor dos conjuntos de dados que estou usando:

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")

Quero criar uma função, vamos chamá-la countingfunctionque me permita inserir o primeiro conjunto de dados, o segundo e chamar um número de dias para olhar para trás. Neste exemplo, escolhi 7 dias:

countingfunction(tweets, ADLData, 7)

Idealmente, isso retornaria um vetor de comprimento tweetsou, neste caso, 2 com contagens para cada um de quantos eventos ADLDataocorreram nos últimos 7 dias a partir da data em tweets. Neste caso, c(2,1).

Respostas

YannikSuhre Aug 16 2020 at 21:12

Então, se eu entendi corretamente, você tem esse tipo de dados:

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 = ""))

E o que você quer fazer é dizer se um tweet está dentro do intervalo de datas ADL ou não. Isso poderia ser feito fazendo isso:

ifelse(tweets %in% ADL, print("its in"), print("its not"))

Você pode atribuir isso facilmente a outro vetor, que então indica se está dentro ou não.

RonakShah Aug 20 2020 at 15:23

Você pode escrever countingfunctioncom a ajuda de outere calcular a diferença de tempo entre cada valor de dois vetores usando difftime.

countingfunction <- function(x1, x2, n) {
  mat <- outer(x1, x2, difftime, units = 'days')  
  rowSums(mat > 0 & mat <= n)
}

Supondo que você tenha vetores de classe POSIXctcomo estes:

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

Você pode passá-los como:

countingfunction(tweets, ADLData, n)
#[1] 2 1