Zählen einer Mindestanzahl von Events pro Zeitschritt

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Ilonia
Beiträge: 30
Registriert: Mi Aug 09, 2017 3:50 pm

Zählen einer Mindestanzahl von Events pro Zeitschritt

Beitrag 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 :)
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Zählen einer Mindestanzahl von Events pro Zeitschritt

Beitrag 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
Antworten