Seite 1 von 1

Zählen einer Mindestanzahl von Events pro Zeitschritt

Verfasst: Do Jun 13, 2019 6:19 pm
von Ilonia
Hallo zusammen!
Ich hab da mal wieder ein kleines Problem und hoffe auf Hilfe :)

ich habe folgenden Datensatz:

Code: Alles auswählen

df <- structure(list(Datum = structure(c(1556668800, 1556672400, 1556676000, 
                                         1556679600, 1556683200, 1556686800, 1556690400, 1556694000, 1556697600, 
                                         1556701200, 1556704800, 1556708400, 1556712000, 1556715600, 1556719200, 
                                         1556722800, 1556726400, 1556730000, 1556733600, 1556737200, 1556740800, 
                                         1556744400, 1556748000, 1556751600, 1556755200, 1556758800, 1556762400, 
                                         1556766000, 1556769600, 1556773200, 1556776800, 1556780400, 1556784000, 
                                         1556787600, 1556791200, 1556794800, 1556798400, 1556802000, 1556805600, 
                                         1556809200, 1556812800, 1556816400, 1556820000, 1556823600, 1556827200, 
                                         1556830800, 1556834400, 1556838000, 1556841600), class = c("POSIXct", 
                                                                                                    "POSIXt"), tzone = "GMT"), Tageszeit = c("Nacht", "Nacht", "Nacht", 
                                                                                                                                             "Nacht", "Nacht", "Nacht", "Nacht", "Nacht", "Tag", "Tag", "Tag", 
                                                                                                                                             "Tag", "Tag", "Tag", "Tag", "Tag", "Tag", "Tag", "Nacht", "Nacht", 
                                                                                                                                             "Nacht", "Nacht", "Nacht", "Nacht", "Nacht", "Nacht", "Nacht", 
                                                                                                                                             "Nacht", "Nacht", "Nacht", "Nacht", "Tag", "Tag", "Tag", "Tag", 
                                                                                                                                             "Tag", "Tag", "Tag", "Tag", "Tag", "Tag", "Nacht", "Nacht", "Nacht", 
                                                                                                                                             df<- read.table("Test.Rforum.csv",sep=";", header=TRUE, stringsAsFactors = F,na.strings="NA")   # files[i] --> Zugriff auf i-tes Element des Objekts files
                                                                                                                                             df<- read.table("Test.Rforum.csv",sep=";", header=TRUE, stringsAsFactors = F,na.strings="NA")   # files[i] --> Zugriff auf i-tes Element des Objekts files
                                                                                                                                             "Nacht", "Nacht", "Nacht", "Nacht", "Nacht"), Auswahl = c(2L, 
                                                                                                                                                                                                       2L, 2L, 0L, 2L, 2L, 0L, 2L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 
                                                                                                                                                                                                       1L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 0L, 0L, 0L, 2L, 2L, 2L, 1L, 1L, 
                                                                                                                                                                                                       1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 2L, 2L, 2L, 0L, 2L, 2L, 2L
                                                                                                                                             )), .Names = c("Datum", "Tageszeit", "Auswahl"), row.names = c(NA, 
                                                                                                                                                                                                            -49L), class = "data.frame")
Mein Ziel ist es zu schauen, ob mindestens 8 mal pro Tag eine "1" oder eine "2" in der Spalte "Auswahl" zu finden ist. Dabei ist es nicht entscheidend ob diese aufeinanderfolgend sind, sondern sie müssen pro Tag auftreten.

In diesem Beispiel hätte ich gerne ein Output der folgendermaßen aussieht:

Code: Alles auswählen

df.out <- structure(list(Datum = structure(c(18017, 18017, 18018, 18018
), class = "Date"), Tageszeit = c("Nacht", "Tag", "Nacht", "Tag"
), Auswahl = c("Ja", "Nein", "Ja", "Ja")), .Names = c("Datum", 
                                                      "Tageszeit", "Auswahl"), row.names = c(NA, -4L), class = "data.frame")
ich habe es zwar geschafft die aufeinanderfolgende Anzahl von Ereignissen mir auszugeben, aber wie ich es anstelle, dass nicht die Länge, sondern eine Mindestanzahl entscheidend ist, weiß ich nicht...
Hier mal der Code für die Anzahl aufeinanderfolgende Ereignisse:

Code: Alles auswählen

df %>%
  mutate(Auswahl = ifelse(is.na(Auswahl), 0, Auswahl)) %>%
  group_by(group = cumsum(c(0, diff(Auswahl) != 0))) %>%
  filter(Auswahl == 1| Auswahl==2 & n() > 1) %>%
  summarize("date"=min(as.character(date)),
            "Daytime"=min(as.character(Tageszeit)),
            "Length"=n()) %>%
  ungroup() %>%
  select(-matches("group"))
Vielen Dank schon mal im Voraus :)

Re: Zählen einer Mindestanzahl von Events pro Zeitschritt

Verfasst: Do Jun 13, 2019 9:03 pm
von jogo
Hallo Ilona,

leider kann ich Deinen Dataframe df nicht rekonstruieren:
mitten in dem Teil

Code: Alles auswählen

structure(...)
taucht read.table(...) auf.
Kannst Du bitte nochmal testen, ob Du die Daten in reproduzierbarer Weise angegeben hast?

Den Dataframe df.out konnte ich problemlos erzeugen.

Nachtrag:
ich habe etwas mit dem Editor rumgewirbelt - jetzt funktioniert die Konstruktion von df:

Code: Alles auswählen

df <- structure(list(Datum = structure(c(1556668800, 1556672400, 1556676000, 
                                         1556679600, 1556683200, 1556686800, 1556690400, 1556694000, 1556697600, 
                                         1556701200, 1556704800, 1556708400, 1556712000, 1556715600, 1556719200, 
                                         1556722800, 1556726400, 1556730000, 1556733600, 1556737200, 1556740800, 
                                         1556744400, 1556748000, 1556751600, 1556755200, 1556758800, 1556762400, 
                                         1556766000, 1556769600, 1556773200, 1556776800, 1556780400, 1556784000, 
                                         1556787600, 1556791200, 1556794800, 1556798400, 1556802000, 1556805600, 
                                         1556809200, 1556812800, 1556816400, 1556820000, 1556823600, 1556827200, 
                                         1556830800, 1556834400, 1556838000, 1556841600), 
class = c("POSIXct", "POSIXt"), tzone = "GMT"), Tageszeit = c("Nacht", "Nacht", "Nacht", "Nacht", "Nacht", "Nacht", "Nacht", "Nacht", "Tag", "Tag", "Tag", 
     "Tag", "Tag", "Tag", "Tag", "Tag", "Tag", "Tag", "Nacht", "Nacht", "Nacht", "Nacht", "Nacht", "Nacht", "Nacht", "Nacht", "Nacht", 
    "Nacht", "Nacht", "Nacht", "Nacht", "Tag", "Tag", "Tag", "Tag", "Tag", "Tag", "Tag", "Tag", "Tag", "Tag", "Nacht", "Nacht", "Nacht",
"Nacht", "Nacht", "Nacht", "Nacht", "Nacht"), Auswahl = c(2L, 2L, 2L, 0L, 2L, 2L, 0L, 2L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 0L, 0L, 0L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 2L, 2L, 2L, 0L, 2L, 2L, 2L )), 
.Names = c("Datum", "Tageszeit", "Auswahl"), row.names = c(NA, -49L), class = "data.frame") 
Ich habe jetzt erstmal folgendes:

Code: Alles auswählen

> aggregate(Auswahl  ~ as.Date(Datum) + Tageszeit, data=df, FUN=function(x) sum(x %in% c(1, 2)))
  as.Date(Datum) Tageszeit Auswahl
1     2019-05-01     Nacht      12
2     2019-05-02     Nacht       9
3     2019-05-03     Nacht       1
4     2019-05-01       Tag       5
5     2019-05-02       Tag       8
Natürlich kann man auch sowas machen:

Code: Alles auswählen

> aggregate(Auswahl  ~ as.Date(Datum) + Tageszeit, data=df, FUN=function(x) 8<=sum(x %in% c(1, 2)))
  as.Date(Datum) Tageszeit Auswahl
1     2019-05-01     Nacht    TRUE
2     2019-05-02     Nacht    TRUE
3     2019-05-03     Nacht   FALSE
4     2019-05-01       Tag   FALSE
5     2019-05-02       Tag    TRUE
wir eine Version mit dplyr:

Code: Alles auswählen

library("dplyr")
myfun <- function(x) 8<=sum(x %in% c(1, 2))
df %>% group_by(as.Date(Datum),Tageszeit) %>% summarise(m=myfun(Auswahl))
oder

Code: Alles auswählen

df %>% group_by(Tag=as.Date(Datum),Tageszeit) %>% summarise(m=sum(Auswahl>0))
Gruß, Jörg