Berechnung von gleichzeitig anwesenden Besuchern

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

Moderatoren: EDi, jogo

ronchen

Berechnung von gleichzeitig anwesenden Besuchern

Beitrag von ronchen »

Hallo zusammen,

ich hoffe hier kann mir einer helfen.Ich hatte diese Frage schon in einem Statistik Forum gefragt aber man hat mich freundlicherweise auf diese Forum aufmerksam gemacht.

Es geht um die Besucherzahlen einer Bibliothek. ich habe von den Besuchern die Ankunftszeit und die Zeit wann sie die Bibliothek verlassen haben.

z.B.
Besucher 1: Ankunft:8:23 Uhr und Abgang: 9:13 Uhr Gesamtzeit in der Bibliothek 50 Minuten
Besucher 2: Ankunft:8:40 Uhr und Abgang: 9:20 Uhr Gesamtzeit in der Bibliothek 40 Minuten
Besucher 3: Ankunft:9:15 Uhr und Abgang: 10:15 Uhr Gesamtzeit in der Bibliothek 60 Minuten

Nun möchte ich wissen wieviele Besucher z.b. zwischen 8 und 9 Uhr gerade in der Bibliothek sind,
d.h. anhand des Beispiels: zwischen 8 und 9 Uhr sind es 2 Besucher (Besucher 1 und Besucher 2), zwischen 9 und 10 Uhr sind es 3(Besucher 1,Besucher 2 und Besucher 3).

Das ganz könnte man nun per Hand auszählen um zu sehen am welchen Tag und um welche Uhrzeit so und so viele Besucher da sind.Aber da es mehrere Tage mit vielen Besuchern sind möchte ich das ganze in R umsetzten.

Folgenden Tip bekam ich auch aus dem anderen Forum. Das man einen Vektor der Länge 24*60 anlegt der zunächst gefüllt mit Nullen ist. Habe ich auch getan.Und nun soll mit Hilfe einer Schleife über alle Besucher ,in einer inneren Schleife für jede Minute, die der Besucher i in der Bibliothek war den passenden Wert in diesem Vektor erhöht werden.

Folgenden Code habe ich jetzt:

Code: Alles auswählen

#Hier filtere ich die Uhrzeit Stunde + Minute aus dem Datum
dt<-dt%>%
  mutate(zei=format(ankunft,format="%H:%M"))%>%
  mutate(zeit2=format(weggang,format="%H:%M"))

#Erstellen des Vektors
anwesend <- rep(0, 24*60)

#Hier nun die Schleife, jeder Besucher hat eine ID von mir zugewiesen bekommen
for(id in dt){
  for(zeit in dt$zeit1:dt$zeit2){
    anwesend[zeit] = anwesend[zeit] + 1
  }
}
In meiner Schleife liegt nun schon der erste Fehler,R gibt mir aus das das ich folgende Fehler habe:

Code: Alles auswählen

Error in crow$zeit1:crow$zeit2 : NA/NaN argument
In addition: Warning messages:
1: In crow$zeit1:crow$zeit2 :
  numerical expression has 56 elements: only the first used
2: In crow$zeit1:crow$zeit2 :
  numerical expression has 56 elements: only the first used
3: In crow$zeit1:crow$zeit2 : NAs introduced by coercion
4: In crow$zeit1:crow$zeit2 : NAs introduced by coercion
Eigentlich hatte ich alle NA entfernt, es liegt so denke ich daran das ich mit Zeitangaben arbeite. Eine weitere Idee war die Minuten die ein Besucher da ist zu berechnen, das konnte ich auch mit difftime() lösen, aber mein eigentliches Problem konnte ich damit nicht lösen. Vielleicht hat ja hier jemand einen Ansatz/Idee wie ich weiter verfahren könnte.


Vielen Dank und viele Grüße Ron
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Berechnung von gleichzeitig anwesenden Besuchern

Beitrag von bigben »

Hallo ronchen,

schön, dass Du hierher gefunden hast. Bitte poste mal das Ergebnis von

Code: Alles auswählen

str(dt)
und zwar nach dem mutate-Gedöns.

Damit Interessierte hier auch ein paar Daten zum Nachvollziehen auf unseren Rechnern haben wäre das Ergebnis von

Code: Alles auswählen

dput(head(dt,200))
schön, falls die Daten nicht der Geheimhaltung unterliegen.

In Deiner Fehlermeldung taucht auf einmal ein Dataframe `crow`auf, von dem bisher nicht die Rede war. Hast Du dazu was zu sagen?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
ronchen

Re: Berechnung von gleichzeitig anwesenden Besuchern

Beitrag von ronchen »

Hallo,

hier die Abfragen:

Code: Alles auswählen

str(dt)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':	56 obs. of  8 variables:
 $ jahr   : int  2018 2018 2018 2018 2018 2018 2018 2018 2018 2018 ...
 $ monat  : int  6 6 6 6 6 6 6 6 6 6 ...
 $ tag    : int  1 1 1 1 1 1 1 1 1 1 ...
 $ ankunft: POSIXct, format: "2018-06-01 00:51:00" "2018-06-01 01:33:00" "2018-06-01 02:06:00" "2018-06-01 02:14:00" ...
 $ abgang : POSIXct, format: "2018-06-01 01:10:00" "2018-06-01 03:23:02" "2018-06-01 03:48:10" "2018-06-01 02:35:01" ...
 $ id     : chr  "1" "2" "3" "4" ...
 $ zeit1  : chr  "00:51" "01:33" "02:06" "02:14" ...
 $ zeit2  : chr  "01:10" "03:23" "03:48" "02:35" ...

Code: Alles auswählen

> dput(head(dt,200))
structure(list(jahr = c(2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L), monat = c(6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L), tag = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
    ankunft = structure(c(1527814260, 1527816780, 1527818760, 
    1527819240, 1527819540, 1527821460, 1527829320, 1527834600, 
    1527835260, 1527835320, 1527836700, 1527837780, 1527840840, 
    1527842940, 1527843720, 1527843840, 1527843900, 1527844560, 
    1527845040, 1527846900, 1527847500, 1527847920, 1527850080, 
    1527850440, 1527851580, 1527851880, 1527854520, 1527855240, 
    1527856140, 1527856260, 1527858000, 1527859200, 1527859440, 
    1527862020, 1527863040, 1527863220, 1527863520, 1527863640, 
    1527865020, 1527868440, 1527869520, 1527871140, 1527871680, 
    1527872040, 1527872940, 1527873420, 1527874860, 1527875700, 
    1527876240, 1527876600, 1527882720, 1527883020, 1527885600, 
    1527888300, 1527889920, 1527890580), class = c("POSIXct", 
    "POSIXt"), tzone = "UTC"), abgang = structure(c(1527815400, 
    1527823382, 1527824890, 1527820501, 1527824241, 1527824881, 
    1527834911, 1527836760, 1527836391, 1527835936, 1527837888, 
    1527856659, 1527843428, 1527846739, 1527844201, 1527847750, 
    1527847067, 1527868698, 1527860282, 1527853599, 1527850711, 
    1527865623, 1527858187, 1527864764, 1527879314, 1527857324, 
    1527860287, 1527865202, 1527875351, 1527868715, 1527860408, 
    1527886861, 1527868716, 1527866998, 1527867828, 1527865519, 
    1527878810, 1527879353, 1527866567, 1527879714, 1527881040, 
    1527874935, 1527881055, 1527875591, 1527888297, 1527881506, 
    1527886951, 1527893512, 1527877243, 1527883778, 1527893240, 
    1527889911, 1527897198, 1527888967, 1527896730, 1527894600
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), id = c("1", 
    "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", 
    "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", 
    "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", 
    "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", 
    "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", 
    "53", "54", "55", "56"), zeit1 = c("00:51", "01:33", "02:06", 
    "02:14", "02:19", "02:51", "05:02", "06:30", "06:41", "06:42", 
    "07:05", "07:23", "08:14", "08:49", "09:02", "09:04", "09:05", 
    "09:16", "09:24", "09:55", "10:05", "10:12", "10:48", "10:54", 
    "11:13", "11:18", "12:02", "12:14", "12:29", "12:31", "13:00", 
    "13:20", "13:24", "14:07", "14:24", "14:27", "14:32", "14:34", 
    "14:57", "15:54", "16:12", "16:39", "16:48", "16:54", "17:09", 
    "17:17", "17:41", "17:55", "18:04", "18:10", "19:52", "19:57", 
    "20:40", "21:25", "21:52", "22:03"), zeit2 = c("01:10", "03:23", 
    "03:48", "02:35", "03:37", "03:48", "06:35", "07:06", "06:59", 
    "06:52", "07:24", "12:37", "08:57", "09:52", "09:10", "10:09", 
    "09:57", "15:58", "13:38", "11:46", "10:58", "15:07", "13:03", 
    "14:52", "18:55", "12:48", "13:38", "15:00", "17:49", "15:58", 
    "13:40", "21:01", "15:58", "15:29", "15:43", "15:05", "18:46", 
    "18:55", "15:22", "19:01", "19:24", "17:42", "19:24", "17:53", 
    "21:24", "19:31", "21:02", "22:51", "18:20", "20:09", "22:47", 
    "21:51", "23:53", "21:36", "23:45", "23:10")), row.names = c(NA, 
-56L), class = c("tbl_df", "tbl", "data.frame"))
Das crow kann ich erklären , bevor der data.frame dt hieß, hieß er crow

Vielen Dank.

edit: nicht über die komischen Zeiten wundern das sind Probezeiten
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Berechnung von gleichzeitig anwesenden Besuchern

Beitrag von bigben »

Hi!

Also wenn die Fehlermeldung sich auf einen alten Datensatz bezieht, der sie angeblich hervorrufende Code sich aber auf einen neuen bezieht, dann ist diese Fehlermeldung nicht aus diesem Code hervorgegangen.
Wenn Du im Code eine Spalte "zei" definierst, das Tibble nachher aber eine Spalte "zeit1" hat, dann ist dieser Datensatz auch nicht mit diesem Code entstanden.

Solche Unordnung führt immer wieder zu unlösbaren Fehlermeldungen etc. Bitte räume da bei Dir ein wenig auf. Alle alten, nicht mehr gebrauchten Variablen und Funktionen löschen Ein

Code: Alles auswählen

rm(list=ls())
tut da oft Wunder.

zeit1 und zeit2 sind jeweils Zeichenketten. Der Doppelpunktoperator kann mit Zeichenketten nichts anfangen. Du musst da schon ganze Zahlen draus machen, eben die Anzahl an Minuten, die seit Mitternacht verstrichen sind.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
ronchen

Re: Berechnung von gleichzeitig anwesenden Besuchern

Beitrag von ronchen »

Hallo,

erstmal nochmals Danke, habe jetzt noch mal alles ordentlich(nach meinen befinden) aufgeräumt.
Ich habe jetzt die Minuten nach Mitternacht berechnet für die Ankunft und für den Abgang.

Folgenden Code habe ich jetzt:

Code: Alles auswählen

#Löschen der NA
dt<-subset(dt,!(is.na(ankunft) | is.na(abgang)))

#Erstellen der Stunden und Minuten aus Ankunft und Abgang, Stunde/Minute=Ankunft, Stund2/Minute2=Abgang
dt<-mutate(dt,hour(dt$ankunft))
dt<-mutate(dt,minute(dt$ankunft))
dt<-mutate(dt,hour(dt$abgang))
dt<-mutate(dt,minute(dt$abgang))
setnames(dt,c("hour(dt$ankunft)"),c("stunde"))
setnames(dt,c("minute(dt$ankunft)"),c("minute"))
setnames(dt,c("hour(dt$abgang)"),c("stunde2"))
setnames(dt,c("minute(dt$abgang)"),c("minute2"))

#Erstellen ID-weiß nciht ob das wirklich notwendig ist
dt<-mutate(dt,id=rownames(dt))

#Berechnung Minuten nach Mitternacht Ankunft, Abgang
dt$minAn<-dt$stunde*60+dt$minute
dt$minAb<-dt$stunde2*60+dt$minute2
Hier nun noch die Abfragen:

Code: Alles auswählen

> str(dt)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':	56 obs. of  12 variables:
 $ jahr   : int  2018 2018 2018 2018 2018 2018 2018 2018 2018 2018 ...
 $ monat  : int  6 6 6 6 6 6 6 6 6 6 ...
 $ tag    : int  1 1 1 1 1 1 1 1 1 1 ...
 $ ankunft: POSIXct, format: "2018-06-01 00:51:00" "2018-06-01 01:33:00" "2018-06-01 02:06:00" "2018-06-01 02:14:00" ...
 $ abgang : POSIXct, format: "2018-06-01 01:10:00" "2018-06-01 03:23:02" "2018-06-01 03:48:10" "2018-06-01 02:35:01" ...
 $ stunde : int  0 1 2 2 2 2 5 6 6 6 ...
 $ minute : int  51 33 6 14 19 51 2 30 41 42 ...
 $ stunde2: int  1 3 3 2 3 3 6 7 6 6 ...
 $ minute2: int  10 23 48 35 37 48 35 6 59 52 ...
 $ id     : chr  "1" "2" "3" "4" ...
 $ minAn  : num  51 93 126 134 139 171 302 390 401 402 ...
 $ minAb  : num  70 203 228 155 217 228 395 426 419 412 ...

dput(head(dt,200))

Code: Alles auswählen

structure(list(jahr = c(2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L), monat = c(6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L), tag = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
    ankunft = structure(c(1527814260, 1527816780, 1527818760, 
    1527819240, 1527819540, 1527821460, 1527829320, 1527834600, 
    1527835260, 1527835320, 1527836700, 1527837780, 1527840840, 
    1527842940, 1527843720, 1527843840, 1527843900, 1527844560, 
    1527845040, 1527846900, 1527847500, 1527847920, 1527850080, 
    1527850440, 1527851580, 1527851880, 1527854520, 1527855240, 
    1527856140, 1527856260, 1527858000, 1527859200, 1527859440, 
    1527862020, 1527863040, 1527863220, 1527863520, 1527863640, 
    1527865020, 1527868440, 1527869520, 1527871140, 1527871680, 
    1527872040, 1527872940, 1527873420, 1527874860, 1527875700, 
    1527876240, 1527876600, 1527882720, 1527883020, 1527885600, 
    1527888300, 1527889920, 1527890580), class = c("POSIXct", 
    "POSIXt"), tzone = "UTC"), abgang = structure(c(1527815400, 
    1527823382, 1527824890, 1527820501, 1527824241, 1527824881, 
    1527834911, 1527836760, 1527836391, 1527835936, 1527837888, 
    1527856659, 1527843428, 1527846739, 1527844201, 1527847750, 
    1527847067, 1527868698, 1527860282, 1527853599, 1527850711, 
    1527865623, 1527858187, 1527864764, 1527879314, 1527857324, 
    1527860287, 1527865202, 1527875351, 1527868715, 1527860408, 
    1527886861, 1527868716, 1527866998, 1527867828, 1527865519, 
    1527878810, 1527879353, 1527866567, 1527879714, 1527881040, 
    1527874935, 1527881055, 1527875591, 1527888297, 1527881506, 
    1527886951, 1527893512, 1527877243, 1527883778, 1527893240, 
    1527889911, 1527897198, 1527888967, 1527896730, 1527894600
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), stunde = c(0L, 
    1L, 2L, 2L, 2L, 2L, 5L, 6L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 
    9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 11L, 11L, 12L, 12L, 12L, 
    12L, 13L, 13L, 13L, 14L, 14L, 14L, 14L, 14L, 14L, 15L, 16L, 
    16L, 16L, 16L, 17L, 17L, 17L, 17L, 18L, 18L, 19L, 19L, 20L, 
    21L, 21L, 22L), minute = c(51L, 33L, 6L, 14L, 19L, 51L, 2L, 
    30L, 41L, 42L, 5L, 23L, 14L, 49L, 2L, 4L, 5L, 16L, 24L, 55L, 
    5L, 12L, 48L, 54L, 13L, 18L, 2L, 14L, 29L, 31L, 0L, 20L, 
    24L, 7L, 24L, 27L, 32L, 34L, 57L, 54L, 12L, 39L, 48L, 54L, 
    9L, 17L, 41L, 55L, 4L, 10L, 52L, 57L, 40L, 25L, 52L, 3L), 
    stunde2 = c(1L, 3L, 3L, 2L, 3L, 3L, 6L, 7L, 6L, 6L, 7L, 12L, 
    8L, 9L, 9L, 10L, 9L, 15L, 13L, 11L, 10L, 15L, 13L, 14L, 18L, 
    12L, 13L, 15L, 17L, 15L, 13L, 21L, 15L, 15L, 15L, 15L, 18L, 
    18L, 15L, 19L, 19L, 17L, 19L, 17L, 21L, 19L, 21L, 22L, 18L, 
    20L, 22L, 21L, 23L, 21L, 23L, 23L), minute2 = c(10L, 23L, 
    48L, 35L, 37L, 48L, 35L, 6L, 59L, 52L, 24L, 37L, 57L, 52L, 
    10L, 9L, 57L, 58L, 38L, 46L, 58L, 7L, 3L, 52L, 55L, 48L, 
    38L, 0L, 49L, 58L, 40L, 1L, 58L, 29L, 43L, 5L, 46L, 55L, 
    22L, 1L, 24L, 42L, 24L, 53L, 24L, 31L, 2L, 51L, 20L, 9L, 
    47L, 51L, 53L, 36L, 45L, 10L), id = c("1", "2", "3", "4", 
    "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", 
    "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", 
    "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
    "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", 
    "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", 
    "56"), minAn = c(51, 93, 126, 134, 139, 171, 302, 390, 401, 
    402, 425, 443, 494, 529, 542, 544, 545, 556, 564, 595, 605, 
    612, 648, 654, 673, 678, 722, 734, 749, 751, 780, 800, 804, 
    847, 864, 867, 872, 874, 897, 954, 972, 999, 1008, 1014, 
    1029, 1037, 1061, 1075, 1084, 1090, 1192, 1197, 1240, 1285, 
    1312, 1323), minAb = c(70, 203, 228, 155, 217, 228, 395, 
    426, 419, 412, 444, 757, 537, 592, 550, 609, 597, 958, 818, 
    706, 658, 907, 783, 892, 1135, 768, 818, 900, 1069, 958, 
    820, 1261, 958, 929, 943, 905, 1126, 1135, 922, 1141, 1164, 
    1062, 1164, 1073, 1284, 1171, 1262, 1371, 1100, 1209, 1367, 
    1311, 1433, 1296, 1425, 1390)), row.names = c(NA, -56L), class = c("tbl_df", 
"tbl", "data.frame"))
So und nun stehe ich leider komplett auf den Schlau, mir fehlt jetzt irgendwie der Ansatz um weiter zu machen. Wie bekomme ich es nun hin das ich darstellen kann so und so viel Besucher waren z.B. um 01:00 Uhr da. Wenn ich in die Tabelle schaue müssten es 2 sein, bei 2:00 Uhr sind es 5 u.s.w..

Mir ist nicht ganz klar wie ich das jetzt mit den Minuten umsetzten kann. Für weitere Tips bin ich wirklich dankbar.

VG und Vielen Dank

PS: Sorry wenn die ersten Post etwas konfus waren bin am lernen es besser zu machen. Wenn etwas im Quellcode nicht in Ordnung bzw. sinnvoll ist, bin ich auch für jeden Tip dankbar :D
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Berechnung von gleichzeitig anwesenden Besuchern

Beitrag von Athomas »

Zwei Hinweise:
  • Die Anzahl der "aktiven" Besucher verändert sich nur, wenn jemand kommt oder geht - klingt trivial, bewirkt aber, dass der Graph der "Besucher-Funktion" eine Treppenfunktion mit Sprüngen lediglich an diesen Zeitpunkten ist. Es ist also eher kontraproduktiv, künstliche (etwa minütliche) Zwischenwerte zu erzeugen.
  • Wenn ich für einen Zeitpunkt die Anzahl der aktiven Besucher wissen will, muss ich die Summe derjenigen bilden, die bis zu diesem Zeitpunkt gekommen sind, und die davon abziehen, die bis dahin gegangen sind (und einen Anfangsbestand, den es bei Dir wohl nicht gibt, dazu addieren).
ronchen

Re: Berechnung von gleichzeitig anwesenden Besuchern

Beitrag von ronchen »

Danke, aus deiner Antwort heraus würde ich also z.B. für 6:00 Uhr formulieren, wenn der Startpunkt 0 Uhr ist: zähle alle Besucher von Ankunft (variable stunde) 0 bis 6 und ziehe die ab ,die bei Abgang(variable stunde 2) kleiner 6 haben.

Wenn ich das Beispiel aus meiner Tabelle nehme zähle ich bis 6(inkl. der 6), 10 Besucher und davon zieh ich nun wiedrum 6 ab, deren abgang kleiner 6 ist, somit bleiben 4 Besucher übrig. Das wäre schonmal genau das was ich haben will. Aber wie kann ich das ganze nun in R umsetzten.

Meine Idee war zu erst die Anzahl der einzelnen stunden von Ankunft zählen zu lassen(also 0 ist einmal vorhanden, 2- 4mal usw) und dann das gleiche mit den Abgangsstunden. Das ganze könnte man folgender maßen lösen:

Code: Alles auswählen

a<-rle(sort(dt1$stunde))
b <- data.frame(number=a$values, n=a$lengths)
a1<-rle(sort(dt1$stunde2))
b1 <- data.frame(number=a1$values, n=a1$lengths)
Somit würde ich 2 data.frames erhalten. Aber ich denke das ist eine sehr unelegante Lösung und zu meinen Ziel komme ich damit auch nicht so richtig.

Habt ihr weitere Anregungen/Ideen für mich, Danke für die Mühen.

VG
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Berechnung von gleichzeitig anwesenden Besuchern

Beitrag von bigben »

Also mein Ansatz mit einem Vektor, der für jede vorkommende Minute die Zahl der anwesenden Personen zählt, könnte nach Einlesen Deines dput oben als 'dt' so aussehen:

Code: Alles auswählen

anwesend <- rep(0,24*60)
for(zeile in 1:nrow(dt))
  anwesend[dt$minAn[zeile]:dt$minAb[zeile]] <- anwesend[dt$minAn[zeile]:dt$minAb[zeile]]+1

summary(anwesend)
plot(anwesend, type="l", main="Anwesenheit 1. Tag", xlab="Minuten")
darstellen kann so und so viel Besucher waren z.B. um 01:00 Uhr da. Wenn ich in die Tabelle schaue müssten es 2 sein, bei 2:00 Uhr sind es 5
Da komme ich auf andere Ergebnisse:

Code: Alles auswählen

> print(anwesend[60])
[1] 1
> print(anwesend[120])
[1] 1
Bei Minute 60 (d. h. 1:00 Uhr) ist nur id 1 da. Welche id wäre denn Dein 2. Anwesender? Bei Minute 120 (2:00 Uhr) ist nur id 2 da. id 1 ist schon wieder weg und alle anderen kommen erst später. Du siehst, die Abfrage ist so wirklich leicht. Du musst halt nur Uhrzeiten umrechnen in Minuten seit Mitternacht.

Athomas', Vorschlag, die Zu- und Abgänge bis zu jedem Zeitpunkt zu zählen, ist ganz sicher der ressourcenschonendere, wenn man nicht einen Tag, sondern Jahre berechnen möchte und sie wäre rasch vorteilhaft, wenn die Zeitangaben nicht auf Minuten, sondern auf Millisekunden genau wären. Mein Ansatz führt zu sehr leicht zu lesendem Code, zu sehr schnellen Abfragen (weil einmal für alle Zeitpunkte gerechnet wird und jedes Mal für jeden Zeitpunkt neu). Du hast in Deiner Frage von "mehreren Tagen" geschrieben - ich bin sicher, Du hast genug RAM und ausreichend Rechenpower, um die Minuten vieler Tage auf diese Weise zu speichern.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Berechnung von gleichzeitig anwesenden Besuchern

Beitrag von Athomas »

Hier mal alternativ eine Umsetzung meiner Vorschläge.
Im ersten Teil werden "Spieldaten" erzeugt, im letzten das Ganze geplottet:

Code: Alles auswählen

gesamt.Personen <- 10                    

Start  <- strptime("2018-01-01 00:00:00", format="%Y-%m-%d %H:%M:%S")
Zeit.1 <- Start + 86400*runif(gesamt.Personen)
Zeit.2 <- Start + 86400*runif(gesamt.Personen)

DF <- data.frame(kommt=pmin(Zeit.1,Zeit.2), geht=pmax(Zeit.1,Zeit.2))
Besucherzahlen <- data.frame(interessante.Zeitpunkte=c(DF$kommt, DF$geht))

Personen.da     <- function(x) sum(DF$kommt <= x) - sum(DF$geht <= x)
Personen.da.vec <- Vectorize(Personen.da)

Besucherzahlen$Anzahl <- Personen.da.vec(Besucherzahlen$interessante.Zeitpunkte) 

library(ggplot2)

Grafik <- ggplot(Besucherzahlen) +
  theme_bw() +
  geom_step(aes(interessante.Zeitpunkte, Anzahl)) +
  geom_point(aes(interessante.Zeitpunkte, Anzahl), colour="red")
Grafik
ronchen

Re: Berechnung von gleichzeitig anwesenden Besuchern

Beitrag von ronchen »

Vielen Dank, das sieht super aus. Du hast natürlich recht mit minuten ist es natürlich perfekt. Hatte bei meiner Überlegung nur auf die Stunden geschaut. Dadurch hatte ich mehr Besucher anwesend , da aber ID=3 erst nach 126 Minuten kommt, wäre es ja falsch gewesen.
Du hast in Deiner Frage von "mehreren Tagen" geschrieben - ich bin sicher, Du hast genug RAM und ausreichend Rechenpower, um die Minuten vieler Tage auf diese Weise zu speichern.
.

Das wäre nun mein nächstes Problem was passiert wenn ich mehrere Tage habe. Da hat ich die Idee das man über deinen Code noch eine for Schleife legt die das ganze für jeden einzelnen Tag berechnet und z.b. in einer 24Std x 31 Tage Matrix oder Data.frame ablegt. Doch da mache ich wahrscheinlich schon wieder einen ganz banalen Fehler und ob die Rechenpower ausreicht kann ich gar nicht sagen, das würde ich dann testen :oops:

Code: Alles auswählen

anwesend <- rep(0,24*60)

for (i in dt1$tag){
for(zeile in 1:nrow(dt1)){
  anwesend[dt1$minAn[zeile]:dt1$minAb[zeile]] <- 
    anwesend[dt1$minAn[zeile]:dt1$minAb[zeile]]+1
}
}
summary(anwesend)
plot(anwesend, type="l", main="Anwesenheit 1. Tag", xlab="Minuten")
Mit meiner eingefügten for Schleife funktioniert es nicht da multipliziert er, auch wenn ich nur einen Tag habe, die Anzahl der Besucher *das Maximun zu einer bestimmten Minute(z.B. Max 14*56 Besucher=784). Natürlich werde ich ja auch nicht mit dem Vektor 24*60 auskommen. Bin euch weiter dankbar für jeden Tip.

VG
Antworten