1
votes

Comment calculer le taux de réapparition des événements dans la trame de données r

J'ai un bloc de données dt avec des milliers d'événements répétitifs qui peuvent s'être produits dans un seul emplacement ou dans les deux emplacements. Comment puis-je calculer / compter le nombre d'événements qui se sont produits uniquement aux deux endroits. Par exemple, dans l'exemple dt ci-dessous, nous pouvons voir 2 événements ( ev2 et ev3 ) se sont produits dans les deux et plus bas, le décompte est donc de 2.

dt<-structure(list(event = c("ev1", "ev1", "ev2", "ev2", "ev2", "ev2", 
"ev2", "ev3", "ev3", "ev3", "ev3", "ev3", "ev3", "ev3", "ev3", 
"ev3", "ev3", "ev3", "ev3", "ev6", "ev6", "ev6", "ev6", "ev6", 
"ev8", "ev8", "ev8", "ev11", "ev11", "ev17"), location = c("Lower", 
"Lower", "Lower", "Lower", "Higher", "Higher", "Higher", "Lower", 
"Higher", "Higher", "Lower", "Lower", "Lower", "Lower", "Lower", 
"Lower", "Lower", "Lower", "Lower", "Lower", "Lower", "Lower", 
"Lower", "Lower", "Higher", "Higher", "Higher", "Lower", "Lower", 
"Lower")), .Names = c("event", "location"), row.names = c(NA, 
-30L), class = c("tbl_df", "tbl", "data.frame"), spec = structure(list(
    cols = structure(list(event = structure(list(), class = c("collector_character", 
    "collector")), location = structure(list(), class = c("collector_character", 
    "collector"))), .Names = c("event", "location")), default = structure(list(), class = c("collector_guess", 
    "collector"))), .Names = c("cols", "default"), class = "col_spec")) 


0 commentaires

4 Réponses :


1
votes

Nous pouvons découvrir l ' événement qui se produit à la fois dans location

df1 <- aggregate(location~event, dt, function(x) all(c("Lower", "Higher") %in% x))

df1$event[df1$location]
#[1] "ev2" "ev3"

length(df1$event[df1$location])
#[1] 2

Ou si vous voulez le décompte

XXX


En base R, nous pouvons utiliser aggregate

dt %>%
  group_by(event) %>%
  filter(all(c("Lower", "Higher") %in% location)) %>%
  pull(event) %>% n_distinct()
#[1] 2


0 commentaires

1
votes

La méthode de Ronak est beaucoup plus robuste, lol, mais vous pouvez aussi simplement supprimer les lignes où les deux sont dupliqués, puis rechercher les doublons dans la colonne d'événement:

temp_df <- dt[!duplicated(dt[c("event","location")]),]
sum(duplicated(temp_df$event))
[1] 2


0 commentaires

0
votes

Vous pouvez également coller des lignes uniques ensemble et compter les préfixes dupliqués en utilisant regexpr.

sum(table(regmatches(v <- unique(apply(dt, 1, paste, collapse="")), regexpr("\\d+", v))) > 1)
# [1] 2


0 commentaires

0
votes

Nous pouvons utiliser data.table

sum(rowSums(table(unique(dt))) == 2)
#[1] 2

Ou avec dplyr

library(dplyr)
dt %>%
    filter(location %in% c("Lower", "Higher")) %>% 
    distinct %>% 
    count(event) %>% 
    filter(n == 2) %>% 
    nrow
#[1] 2


0 commentaires