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"))
4 Réponses :
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
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
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
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