Auswahl von erstem Wert über Schwellenwert

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Rnest2
Beiträge: 11
Registriert: Mi Jan 27, 2021 2:33 pm

Auswahl von erstem Wert über Schwellenwert

Beitrag von Rnest2 »

Hallo liebes Forum,
ich habe (wie so viele) ein hoffentlich leicht zu lösendes Problem. Leider komme ich auf momentan auf keine einfache bzw. gute Lösung.
Mein Datensatz ist folgender:

https://covid.ourworldindata.org/data/o ... d-data.csv

Hierbei interessiert mich die Variable "total_cases_per_million". Von dieser hätte ich gern für alle erfassten Länder den ersten Wert über einem Schwellenwert (z.B. 10.000). Per subset ist es kein Problem alle Ausprägungen darunter wegzufiltern, aber von oben funktioniert es analog nicht.
Für einen kleinen Analysedurchlauf habe ich da ganze mal für europäischen Länder händisch vollzogen..
sieht dann so aus..

Code: Alles auswählen

av_casesx <- subset(av_cases, (CountryName == "Albania" & total_cases_per_million < 12.000 | 
CountryName == "Austria" & total_cases_per_million < 11.000 | 
CountryName == "Belarus" & total_cases_per_million < 12.000 | 
CountryName == "Belgium" & total_cases_per_million < 12.000 | 
CountryName == "Bulgaria" & total_cases_per_million < 12.000 |  
CountryName == "Bosnia and Herzegovina" & total_cases_per_million < 12.000 | 
CountryName == "Croatia" & total_cases_per_million < 12.000 | 
CountryName == "Czech Republic" & total_cases_per_million < 12.000| 
CountryName == "Cyprus" & total_cases_per_million < 16.000 | 
CountryName == "Denmark" & total_cases_per_million < 20.000 | 
CountryName == "Estonia" & total_cases_per_million < 13.000 | 
CountryName == "Finland" & total_cases_per_million < 12.000 | 
CountryName == "France" & total_cases_per_million < 12.000 | 
CountryName == "Germany" & total_cases_per_million < 10.500 | 
CountryName == "Greece" & total_cases_per_million < 13.000 | 
CountryName == "Hungary" & total_cases_per_million < 12.000 | 
CountryName == "Iceland" & total_cases_per_million < 18.000 | 
CountryName == "Ireland" & total_cases_per_million < 15.000 | 
CountryName == "Italy" & total_cases_per_million < 12.000 | 
CountryName == "Latvia" & total_cases_per_million < 12.000 | 
CountryName == "Lithuania" & total_cases_per_million < 13.000 | 
CountryName == "Luxembourg" & total_cases_per_million < 12.000 | 
iso_code == "MKD" & total_cases_per_million < 15.000 | 
iso_code == "MLT" & total_cases_per_million < 12.000 | 
CountryName == "Moldova" & total_cases_per_million < 14.000 | 
iso_code == "MNE" & total_cases_per_million < 14.000 | 
CountryName == "Netherlands" & total_cases_per_million < 12.000 | 
CountryName == "Norway" & total_cases_per_million < 12.000 | 
CountryName == "Poland" & total_cases_per_million < 12.000 | 
CountryName == "Portugal" & total_cases_per_million < 12.000 | 
CountryName == "Romania" & total_cases_per_million < 12.000 | 
CountryName == "Russia" & total_cases_per_million < 12.000 | 
CountryName == "Serbia" & total_cases_per_million < 12.000 | 
CountryName == "Slovakia" & total_cases_per_million < 12.000 | 
CountryName == "Slovenia" & total_cases_per_million < 15.000 | 
CountryName == "Spain" & total_cases_per_million < 12.000 | 
CountryName == "Sweden" & total_cases_per_million < 14.000 | 
CountryName == "Switzerland" & total_cases_per_million < 12.000 | 
CountryName == "Ukraine" & total_cases_per_million < 12.000 | 
CountryName == "United Kingdom" & total_cases_per_million < 18.000),
                    select=c(iso_code, CountryName, date, C1_School.closing, C2_Workplace.closing, C3_Cancel.public.events, 
                    C4_Restrictions.on.gatherings, C5_Close.public.transport, C6_Stay.at.home.requirements, 
                    C7_Restrictions.on.internal.movement, C8_International.travel.controls, H1_Public.information.campaigns, 
                    StringencyIndex, GovernmentResponseIndex, total_cases_per_million))
Da macht wenig Spaß und ich wäre gerne flexibel was den Schwellenwert angeht.
Hoffe ich konnte mein Probleme verständlich schildern und freue mich auf Anregungen eurerseits.

Vielen Dank im Voraus.
Rnest2
Zuletzt geändert von jogo am Mi Jan 27, 2021 8:12 pm, insgesamt 1-mal geändert.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Auswahl von erstem Wert über Schwellenwert

Beitrag von jogo »

Hallo Rnest2,

willkommen im Forum!
Kannst Du uns den Code zeigen, mit dem Du die Daten einliest? (dann müssen wir nicht erst rumexperimentieren.)
Ein erste Schritt zur Automatisierung wäre eine Tabelle (als Dataframe) in der Form:

Code: Alles auswählen

CountryName  Schwellenwert 
Albania          12000
...
Hast Du so eine Tabelle schon?

Gruß, Jörg
Rnest2
Beiträge: 11
Registriert: Mi Jan 27, 2021 2:33 pm

Re: Auswahl von erstem Wert über Schwellenwert

Beitrag von Rnest2 »

Hallo Jörg, danke für deine schnelle Rückmeldung..

Code: Alles auswählen

owid <- read.csv("owid-covid-data.csv")
dann merge ich den Datensatz mit zwei weiteren zum Dataframe "av", benenne ein paar Länder um, aber das sollte an meinen Problem nichts ändern. Anschließend folgt das erste Subset mit dem entfernen der Werte unter dem Schwellwert..

Code: Alles auswählen

av_cases <- subset(av, total_cases_per_million > 10,000, select=c(iso_code, CountryName, date, C1_School.closing, 
C2_Workplace.closing, C3_Cancel.public.events, C4_Restrictions.on.gatherings, C5_Close.public.transport, 
C6_Stay.at.home.requirements, C7_Restrictions.on.internal.movement, C8_International.travel.controls, 
H1_Public.information.campaigns, StringencyIndex, GovernmentResponseIndex, total_cases_per_million))
So eine Tabelle habe ich noch nicht. Reicht es, die auch per Subset zu erstellen, oder wie bekomme ich die am besten hin?
Bin gespannt wie ich die für eine Automatisierung nutzen kann und wie sich eine Lösung langsam (oder auch gerne zügig) zusammenstellt..

Merci bien

Rnest2
Rnest2
Beiträge: 11
Registriert: Mi Jan 27, 2021 2:33 pm

Re: Auswahl von erstem Wert über Schwellenwert

Beitrag von Rnest2 »

Um mein Anliegen weiter voran zu treiben..

Eine Tabelle mit den Ländern und den Ländercodes hatte ich schon erstellt. Doppelte Einträge entfernt.

Code: Alles auswählen

countries <- subset(owid, select=c(iso_code, location))
countries <- unique(countries)
die Variable "iso_code" und "location" werden im Merge und weiteren subset von "CountryCode" und "CountryName" ersetzt. Wie ich die SPalte mit dem Schwellenwert generiere weiß ich gerade spontan nicht. Sollte aber (mit eurer Hilfe) kein großen Problem darstellen. Leider habe ich gar keine Idee, wie ich im weiteren Prozess eine Abfrage mit Hilfe der Tabelle vornehme.. Irgendwie mit der Einbindung von Schleifen, aber damit habe ich bisher keine Erfahrung.

Trotzdem kam mir der Gedanke, dass ich den ersten Wert über dem Schwellenwert, mit einem subset des jüngsten Datums (Funktion min!?) für jedes LAnd abfragen könnte.. Da kommt wahrscheinlich die Tabelle ins Spiel, und somit bin ich wieder am Ende meiner Kenntnisse..

Ich hoffe ihr wollt und könnt mir weiterhelfen..

R2
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Auswahl von erstem Wert über Schwellenwert

Beitrag von jogo »

Hallo Rnest2,

hier mal ein kleiner Test mit einheitlichem Schwellenwert für alle Länder:

Code: Alles auswählen

ersterUeberSchwelle <- function(x, Schwelle)   min(x[x>Schwelle])
ersterUeberSchwelle(10:3, 5)  ### Test

owid <- read.csv("https://covid.ourworldindata.org/data/owid-covid-data.csv")
aggregate(total_cases_per_million ~ iso_code, data=owid, FUN=ersterUeberSchwelle, Schwelle=12) 
Bitte schau mal, ob die Funktion ersterUeberSchwelle() das tut, was Du möchtest für die Werte aus $total_cases_per_million .

Die Lösung für je nach Land verschiedene Schwellenwerte wird wahrscheinlich irgendwas mit mapply() oder/und split() + sapply()
... demnächst

so, da bin ich wieder:

Code: Alles auswählen

owidList <- split(owid, owid$iso_code)

Schwellen <- read.table(header=TRUE, text=
"iso_code  Schwellenwert 
AFG         12.000
MKD         15.000")

mapply(function(i, S) ersterUeberSchwelle(owidList[[i]]$total_cases_per_million, S), 
       as.character(Schwellen$iso_code), Schwellen$Schwellenwert)
Mit data.table sieht das bestimmt noch etwas hübscher aus.

Gruß, Jörg
Rnest2
Beiträge: 11
Registriert: Mi Jan 27, 2021 2:33 pm

Re: Auswahl von erstem Wert über Schwellenwert

Beitrag von Rnest2 »

Hallo Jörg, danke für dein Engangement!
Der Code für den kleinen Test funktioniert soweit. Ob dabei die korrekten Daten für meinen Zweck ausgegeben werden konnte ich jetzt noch nicht überprüfen (dafür bräuchte ich die Variable "date") und dafür habe ich auch erst morgen wieder Zeit für.
Was ich gerade versucht habe, ist, diese und weitere Variablen ausgeben zu lassen. Vor allem ist mir "date" wichtig, weil ich damit (dem Zeitpunkt wann der Schwellenwert überschritten wird) aus einer anderen Tabelle (die dazu gemerged wird) weitere Daten herausfiltern möchte..

Code: Alles auswählen

owid10k <- aggregate(total_cases_per_million ~ iso_code, data=owid, FUN=ersterUeberSchwelle, Schwelle=10) 
Wie ich jetzt in oder zum Befehl "aggregate" noch sowas wie select oder subset hinzufügen kann, hat mit den ersten Versuchen nicht funktioniert, muss ich morgen weiter ausprobieren. Wäre für einen Tipp dankbar.

Den Code für verschiedene Schwellenwerte habe ich mir noch nicht angucken können. Soweit meine Untersuchungsplanung da vorsieht, werde ich das nicht brauchen, aber man weiß ja nie.. ist auf jeden Fall erstebenswert auch das zu verstehen.
Hast du/ihr einen Link, wo man sich über mögliche Funktionen in Rstudio einlesen kann.. nach vollziehen kann ich deine function(x, Schwelle) jedoch nicht vollkommen verstehen, da ich in meinen halben Jahr den ich jetzt mit dem Programm verbracht habe, ein solches Date noch nicht genießen durfte.

So.. viel Text ohne Sinn, muss man im Lockdown ja auch mal loswerden..
Ich bedanke und verneige mich..

R2
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Auswahl von erstem Wert über Schwellenwert

Beitrag von jogo »

Hallo R2,
Rnest2 hat geschrieben: Do Jan 28, 2021 4:01 pm Hallo Jörg, danke für dein Engangement!
Der Code für den kleinen Test funktioniert soweit. Ob dabei die korrekten Daten für meinen Zweck ausgegeben werden konnte ich jetzt noch nicht überprüfen (dafür bräuchte ich die Variable "date") und dafür habe ich auch erst morgen wieder Zeit für.
hm, also von der Variablen date war bisher nicht die Rede.
Ich fürchte, ich habe Dein Anliegen nicht richtig verstanden.

Code: Alles auswählen

Was ich gerade versucht habe, ist, diese und weitere Variablen ausgeben zu lassen. Vor allem ist mir "date" wichtig, weil ich damit (dem Zeitpunkt wann der Schwellenwert überschritten wird) aus einer anderen Tabelle (die dazu gemerged wird) weitere Daten herausfiltern möchte..
hiermit ist klar, dass Du Dein Anliegen nicht genau beschrieben hast. Denn es ist durchaus ein Unterschied, ob Du in einem Vektor einen bestimmten Wert suchst oder den Index dieses Elementes.
Deshalb ist ein reproduzierbares Beispiel (einschließlich des gewünschten Ergebnisses) so wichtig. An so einem Beispiel kann auch der Helfende überprüfen, ob seine Interpretation der verbalen Beschreibung dem Wunsch des Fragenden entspricht.
viewtopic.php?f=20&t=11
https://stackoverflow.com/questions/596 ... le-example

Code: Alles auswählen

[code]
owid10k <- aggregate(total_cases_per_million ~ iso_code, data=owid, FUN=ersterUeberSchwelle, Schwelle=10) 
Wie ich jetzt in oder zum Befehl "aggregate" noch sowas wie select oder subset hinzufügen kann, hat mit den ersten Versuchen nicht funktioniert, muss ich morgen weiter ausprobieren. Wäre für einen Tipp dankbar.[/code]Da ich nicht richtig verstanden hatte, was Du möchtest, ist es sehr wahrscheinlich, dass die Lösung für das, was Du möchtest, anders aussieht (wahrscheinlich auch nicht mit aggregate())

Code: Alles auswählen

Hast du/ihr einen Link, wo man sich über mögliche Funktionen in Rstudio einlesen kann.. nach vollziehen kann ich deine function(x, Schwelle) jedoch nicht vollkommen verstehen, da ich in meinen halben Jahr den ich jetzt mit dem Programm verbracht habe, ein solches Date noch nicht genießen durfte.
hm, meinst Du einführende Literatur? Kennst Du auf CRAN dies:
https://cran.r-project.org/manuals.html und
https://cran.r-project.org/other-docs.html#nenglish :?:

... oder meinst Du eine Übersicht über die wichtigsten Funktionen?
auch auf https://cran.r-project.org/manuals.html und
viewtopic.php?f=20&t=27

Code: Alles auswählen

So.. viel Text ohne Sinn, muss man im Lockdown ja auch mal loswerden.. 
Ich bedanke und verneige mich..
Danke für die Blumen.
... ganz sinnbefreit war der Text nicht. ;)

Gruß, Jörg
Rnest2
Beiträge: 11
Registriert: Mi Jan 27, 2021 2:33 pm

Re: Auswahl von erstem Wert über Schwellenwert

Beitrag von Rnest2 »

Hallo Jörg, liebes Forum.
das tut mir leid, dass ich ungenau beschrieben habe. Ich dachte (jaja), dass es einen einfachen Weg gibt, einen Schwellenwert identifizieren, das zugehörige Datum und damit die ganzen rechtlichen Variablen ausgeben zu lassen.
Im Idealfall, und wie ich das für die europäischen Staaten manuel zurechtgetippt habe, sieht das Ergebnis dann so aus..
aveu-fürforum.png
Auch als.csv im Anhang. Ist das besser nachzuvollziehen?

Wenn noch Bereitschaft besteht - was mich SEHR erfreuen würde - Ideen für eine Problemlösung beizutragen, stelle auch gerne meinen bisherigen Code mit den gemergten Dateien zu Verfügung.

Gruß
R2
Dateianhänge
C19_AV_Eur.csv
(2.97 KiB) 65-mal heruntergeladen
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Auswahl von erstem Wert über Schwellenwert

Beitrag von jogo »

Hallo R2,

wenn ich es richtig verstanden habe, möchtest Du für jedes Land die Zeile (mit dem Tag=Datum) haben, an dem das erste Mal bei dem Wert in der Spalte ... ein bestimmter Schwellenwert überschritten wurde.
Ist das so richtig :?:

Sind die Einträge eines jeden Landes nach dem Tagesdatum aufsteigend sortiert in der Tabelle?

Ist der Schwellenwert einheitlich für alle Länder?

Gruß, Jörg
Rnest2
Beiträge: 11
Registriert: Mi Jan 27, 2021 2:33 pm

Re: Auswahl von erstem Wert über Schwellenwert

Beitrag von Rnest2 »

Hallo Jörg,

3x Ja.. denke, dass es am ehesten funktioniert, wenn man alles unter dem Schwellenwert per subset wegfiltert und dann über das (jüngste) Datum auswählt. Deine Meinung dazu?

Ich bin leider noch icht dazu gekommen deine Links zu checken, aber VIELEN DANK dafür..

Ebenso habe ich noch nicht kapiert wie man eine zusätzliche Tabelle (Dataframe mit den Ländern) als "Abfragemodul" nutzt.. Hier wäre ich über einen Verweis oder eine Erläuterung dankbar.

evtl. kommt bei Bedarf noch eine zusätziche Abfrage von x-Tagen nach dem überschreiten des Schwellenwertes, aber blende ich jetzt erstmal aus ;)

Mille Gracie
R2
Antworten