Werte nach Bedingungen aus Matrix entfernen

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

Moderatoren: EDi, jogo

Antworten
clarry
Beiträge: 4
Registriert: Do Jan 26, 2023 9:16 am

Werte nach Bedingungen aus Matrix entfernen

Beitrag von clarry »

Hallo zusammen,

ich habe eine sehr große Matrix mit täglichen Niederschlagswerten von 1662 Stationen die wie folgt aufgebaut ist:

V1 V2 V3 V3
19800101 0.1 3.1 0 NA
19800102 1.2 1.2 0 NA
19800103 3.1 4.5 0 NA
19080104 0 1.1 0 NA

usw. (deckt einen Zeitraum von 1980-2010 ab). Nun möchte ich mit einer Schleife bestimmt Jahre ganz entfernen. Die Bedingung, damit ein Jahr gelöscht werden soll muss so laufen, dass wenn innerhalb eines Jahres ein Monat an Daten fehlen (NA) , das ganze Jahr gelöscht werden soll.

Dazu habe ich die Daten (name:stringdate) als character vorleiegen:

[1] "19800101" "19800102"
[11] "19800111" "19800112"
[21] "19800121" "19800122"
usw.

dazu habe ich bereits die values d=31L und mo =12L als numeric vorliegen.

dankeschön im voraus!
Dateianhänge
Matrix.JPG
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Werte nach Bedingungen aus Matrix entfernen

Beitrag von EDi »

Die Stationen sind in Spalten?

Hab ich die Logik richtig verstanden:

Wenn in irgendeiner Spalte ein ganzer Monat (also z.b. ganzer Februar) fehlt, sollen allen Zeilen dieses monats entfernt werden (also alle spalten). Wenn aber Daten z.B. 3.2. bis zum 29.3. fehlen passiert nichts (weil zwei unganze Monate fehlen).

Bitte ein reproduzierbares Beispiel posten, sonst können wir nicht zielgerichtet helfen.
Ohne kann ich nur meine Vorgehensweise skizzieren. Ich würde :
1. Die Daten ins lange Format bringen
2. Den Datumstring in ein Datumstyp umwandeln
3. Je Monat und Jahr aggregieren
4. Dann Monate rauswerfen (z.B. anti join mit (3))
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
clarry
Beiträge: 4
Registriert: Do Jan 26, 2023 9:16 am

Re: Werte nach Bedingungen aus Matrix entfernen

Beitrag von clarry »

Hallo,

genau also die Stationen entsprechen den Spalten V1, V2, V3 usw.
Es geht darum, dass wenn in einer Spalte (also bei einer Station) in einem Monat alle Werte fehlen (NAs), das ganze Jahr auf NA gesetzt werden soll. Ich muss nämlich später jahreszeitliche Daten generieren und wenn schon ein Monat fehlt, dann ist die Jahreszeit nachher nicht mehr repräsentativ genug. Wenn weniger als 30 bzw. 31 Tage innerhalb eines Monats fehlen ist das nicht so schlimm.
Ich hatte gedacht man kann das ganze mit einer Schleife generieren und mit einem Loop über die gesamte Matrix laufen lassen, da das Datenformat eig. beibehalten werden soll.
Also es ist richtig, dass wenn z.B 19800312 - 19800403 fehlen, behalte ich alles bei.
Was ein Tag und ein Monat ist habe ich bereits in R definiert , also das d = 31 , bzw. 31, bzw. 28 Tage beinhaltet.

Gruß,
clarry
clarry
Beiträge: 4
Registriert: Do Jan 26, 2023 9:16 am

Re: Werte nach Bedingungen aus Matrix entfernen

Beitrag von clarry »

so habe ich bis hierhin gearbeitet um alles in die Matrix zu bekommen, wie es im Bild aussieht:
Die Matrix heißt DWD

dayspermonth = function(ja,mo) {
if (mo %in% c(1,3,5,7,8,10,12)) {
tag = 31
} else if (mo %in% c(4,6,9,11)){
tag = 30
} else {
tag = 28
if (ja %% 4 == 0) {
tag = 29
}
}
return(tag)
}



lsstat = dir(patter = 'Station')

(n = length(lsstat))
ja0 = 1980
ja1 = 2010

stringdate = character (20000)
i = 0
for (ja in ja0:ja1) {
for (mo in 1:12) {
mm = mo
if (mo < 10) mm = paste0(0,mo)
m = dayspermonth(ja,mo)
for (d in 1:m) {
i = i + 1
if (d < 10) {
dd = paste0(0,d)
} else {
dd = d
}
stringdate = paste0(ja,mm,dd)
}
}
}


m = i
DWD = matrix(NA, nrow = m, ncol = n)
rownames(DWD) = stringdate[1:m]
sname = character(n)

j = 0
for (i in 1:n) {
print(i)
A = read.csv2(lsstat)
cdate = as.character(A$MESS_DATUM)
A$MESS_DATUM = cdate
A$year = as.numeric(substring(cdate,1,4))
A$month = as.numeric(substring(cdate,5,6))
A$day = as.numeric(substring(cdate,7,8))
A$RS = as.numeric(A$RS)
ymin = min(A$year)
ymax = max(A$year)
if (ja0 < ymin) next
if (ja1 > ymax) next
j = j + 1
print(j)
B = subset(A, ja0 <= year & year <= ja1)
nn = nrow(B)
print(nn)
sname[j] = paste0('S_',B$STATIONS_ID[1])
for (k in 1:nn) {
date = B$MESS_DATUM[k]
DWD[date,j] = B$RS[k]
}
}
df_DWD = as.data.frame(DWD[,1:j])
names(df_DWD) = sname[1:j]

stringdate = stringdate[1:m]
df_DWD$year = as.numeric(substring(stringdate,1,4))
df_DWD$month = as.numeric(substring(stringdate,5,6))
df_DWD$day = as.numeric(substring(stringdate,7,8))
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Werte nach Bedingungen aus Matrix entfernen

Beitrag von bigben »

EDi hat geschrieben: Do Jan 26, 2023 9:30 pm
Bitte ein reproduzierbares Beispiel posten, sonst können wir nicht zielgerichtet helfen.
---
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: Werte nach Bedingungen aus Matrix entfernen

Beitrag von Athomas »

Hallo zusammen, da es nicht ganz einfach sein wird, ein "reproduzierbares Beispiel" zu liefern (denn dazu gehören auch Daten, die es ermöglichen, eine auf die Situation passende Lösung auszutesten), möchte ich damit unserem Fragesteller aushelfen.

Das unten stehende R-Progrämmchen erzeugt eine data.table mit simulierten täglichen Messwerten von 1662 Stationen (S0001 bis S1662) im Zeitraum 1980 - 2010. Ab und zu fehlt mal ein Wert, aber es werden auch 100 "Totalausfälle" (kompletter Monat für Messstation fehlt) eingebaut.

Für die Simulation bin ich in einigen Teilen EDis Vorschlag - den ich für gut und richtig halte - rückwärts gegangen...

Man beachte auch bitte die Performance von data.table!

Code: Alles auswählen

library(data.table)

Anfang <- as.Date("1980-1-1")
Ende   <- as.Date("2010-12-31")

alleTage   <- seq(Anfang, Ende, by="day")
AnzahlTage <- length(alleTage)

AnzahlStationen <- 1662
AnzahlMesswerte <- AnzahlTage*AnzahlStationen

StationenNamen  <- paste0("S", sprintf("%04d", 1:AnzahlStationen))

Messwerte <- data.table(Datum=rep(alleTage, AnzahlStationen),
                        Messwerte = runif(AnzahlMesswerte)*
                                    sample(c(0,1),  
                                           AnzahlMesswerte, 
                                           replace=TRUE, 
                                           prob=c(0.2, 0.8))*
                                    sample(c(NA,1), 
                                           AnzahlMesswerte, 
                                           replace=TRUE, 
                                           prob=c(0.1, 0.9)),
                        Station=rep(StationenNamen, each=AnzahlTage))

vorkommendeDaten <- Messwerte[  , .N, by=Datum]
vorkommendeDaten[  , c("Jahr","Monat","Tag"):=tstrsplit(as.character(Datum), "-")]
setkey(vorkommendeDaten, Datum)
setkey(Messwerte, Datum)

MesswertePlus <- vorkommendeDaten[Messwerte]

erfassteMonate <- vorkommendeDaten[  , .N, by=.(Jahr, Monat)]

AnzahlAusfälle <- 100

Totalausfälle <- erfassteMonate[sample(1:nrow(erfassteMonate), AnzahlAusfälle), .(Monat,Jahr)]

Totalausfälle[  , ":="(Station=sample(StationenNamen, nrow(Totalausfälle)), Ausfall="ja")]

setkey(MesswertePlus, Monat, Jahr, Station)
setkey(Totalausfälle, Monat, Jahr, Station)

Zsamma <- Totalausfälle[MesswertePlus]
Zsamma[Ausfall=="ja", Messwerte:=NA]

Messtable <- dcast(Zsamma, Datum ~ Station, value.var="Messwerte")
Antworten