Seite 1 von 2
Doppelte Einträge aus Zeile entfernen
Verfasst: Do Jan 09, 2020 3:50 pm
von Effigy
Hallo,
ein neuer Tag, ein neues Problem. Ich habe folgenden dataframe
Code: Alles auswählen
data.frame': 15994 obs. of 41 variables:
$ Date : chr "12.04.19" "12.04.19" "12.04.19" "12.04.19" ...
$ Time : chr "2:30 a" "3:00 a" "3:30 a" "4:00 a" ...
$ Out : num 1.8 1.7 1.6 1.6 1.6 1.6 1.3 1.2 0.9 1.2 ...
$ Temp : num 1.8 1.8 1.8 1.7 1.7 1.7 1.7 1.3 1.2 1.3 ...
$ Temp.1 : num 1.7 1.7 1.6 1.6 1.5 1.6 1.3 1.1 0.9 0.9 ...
$ Hum : int 80 80 80 80 79 79 80 81 83 82 ...
$ Pt. : num -1.3 -1.4 -1.5 -1.5 -1.6 -1.6 -1.7 -1.7 -1.7 -1.6 ...
$ Speed : num 1.8 2.2 1.8 2.2 1.8 2.2 1.8 1.3 0.9 1.3 ...
$ Dir : chr "NE" "NE" "NE" "NE" ...
$ Run : num 3.22 4.02 3.22 4.02 3.22 4.02 3.22 2.41 1.61 2.41 ...
Viele Einträge sind doppelt und haben daher in der Variable "TIme" ein Suffix wie "a" oder "p" wie unten dargestellt.
Code: Alles auswählen
> dput(WSDede$Time [1:50],)
c("2:30 a", "3:00 a", "3:30 a", "4:00 a", "4:30 a", "5:00 a",
"5:30 a", "6:00 a", "6:30 a", "7:00 a", "7:30 a", "8:00 a", "8:30 a",
"9:00 a", "9:30 a", "10:00 a", "10:30 a", "11:00 a", "11:30 a",
"12:00 p", "12:30 p", "1:00 p", "1:30 p", "2:00 p", "2:30 p",
"3:00 p", "3:30 p", "4:00 p", "4:30 p", "5:00 p", "5:30 p", "6:00 p",
"6:30 p", "7:00 p", "7:30 p", "8:00 p", "8:30 p", "9:00 p", "9:30 p",
"10:00 p", "10:30 p", "11:00 p", "11:30 p", "12:00 a", "12:30 a",
"1:00 a", "1:30 a", "2:00 a", "2:30 a", "3:00 a")
Meine Frage: Wie entferne ich die doppelten EInträge, also alle die ein a oder p noch zusätzlich haben? Habe es schon mit distinct () aus dem dplyr package versucht, aber da schmeißt er mir immer fast alles raus.. Danke!
Re: Doppelte Einträge aus Zeile entfernen
Verfasst: Do Jan 09, 2020 4:00 pm
von jogo
Hallo Max,
ich verstehe die Logik noch nicht. Wenn Du alle Einträge bei $Time entfernen möchtest, die entweder ein "a" oder ein "p" am Ende haben, dann sehe ich nicht, welche dann noch übrig bleiben sollen.
Kannst Du bitte zeigen, wie Dein Ergebnis aussehen soll?
Gruß, Jörg
Re: Doppelte Einträge aus Zeile entfernen
Verfasst: Do Jan 09, 2020 6:22 pm
von bigben
Ich finde das auch unverständlich. Die Bedeutung der a und p ist doch ganz leicht zu erkennen und hat ganz sicher gar nichts mit doppelten Einträgen zu tunl
Re: Doppelte Einträge aus Zeile entfernen
Verfasst: Fr Jan 10, 2020 11:14 am
von Effigy
Hallo zusammen,
ok das ist vielleicht umständlich ausgedrückt gewesen. Was ich meine ist, dass ich nur alle Werte mit entweder "a" oder "p" brauche. Der Einfachheit halber sagen wir jetzt einfach mal, ich will nur noch die Werte mit "a" haben. Die mit "p" sollen weg, weil sie überflüssig sind. Hintergrund: Es handelt sich hierbei um Daten von Wetterstationen, die wir alle paar Monate gesammelt haben und die sich insbesondere am Anfang des Monats halt immer überschneiden und somit teilweise doppelt sind. Hoffe, es ist jetzt klarer geworden. 1000 Dank an euch :*
Lieben Gruß,
Max
Re: Doppelte Einträge aus Zeile entfernen
Verfasst: Fr Jan 10, 2020 12:02 pm
von bigben
Code: Alles auswählen
Time <- c("2:30 a", "3:00 a", "3:30 a", "4:00 a", "4:30 a", "5:00 a",
"5:30 a", "6:00 a", "6:30 a", "7:00 a", "7:30 a", "8:00 a", "8:30 a",
"9:00 a", "9:30 a", "10:00 a", "10:30 a", "11:00 a", "11:30 a",
"12:00 p", "12:30 p", "1:00 p", "1:30 p", "2:00 p", "2:30 p",
"3:00 p", "3:30 p", "4:00 p", "4:30 p", "5:00 p", "5:30 p", "6:00 p",
"6:30 p", "7:00 p", "7:30 p", "8:00 p", "8:30 p", "9:00 p", "9:30 p",
"10:00 p", "10:30 p", "11:00 p", "11:30 p", "12:00 a", "12:30 a",
"1:00 a", "1:30 a", "2:00 a", "2:30 a", "3:00 a")
# nützliche Hilfsfunktion
last.letter <- function(string){
l <- nchar(string)
substr(string, l, l)
}
# Test der nützlichen Hilfsfunktion
last.letter(Time[1])
last.letter(Time[20])
last.letter(Time[c(1, 20)])
# Anwendungsbeispiele
Filter(function(x) last.letter(x)=="a", x = Time)
Filter(function(x) last.letter(x)=="p", x = Time)
which(last.letter(Time) == "a") # Welche Zeilen des Dataframes haben eine Time die auf "a" endet?
HTH,
Bernhard
Re: Doppelte Einträge aus Zeile entfernen
Verfasst: Fr Jan 10, 2020 1:47 pm
von Effigy
Danke Bernhard! Allerdings möchte ich ja die restlichen Variablen des dataframe wie Date, Temp, etc. sowie die Werte aus $Time ohne die Suffixe "a" bzw. "p" ja auch noch behalten. Wie bekomm ich das hin?
Liebe Grüße,
Max
Re: Doppelte Einträge aus Zeile entfernen
Verfasst: Fr Jan 10, 2020 2:15 pm
von ruedi_br
Blöd nachgefragt: bei den Suffixen a und p handelt es sich doch um ante und post meridien, also vor und nach Mittags.
Ist das vom Datenmaterial wirklich sinnhaft, Messwerte von 8:30 zu nehmen und die von 20:30 wegfallen zu lassen?
VG
Ruedi
Re: Doppelte Einträge aus Zeile entfernen
Verfasst: Fr Jan 10, 2020 4:14 pm
von bigben
Effigy hat geschrieben: Fr Jan 10, 2020 1:47 pm Wie bekomm ich das hin?
Hallo Max,
in meinem Beispiel oben habe ich mit
which die Zeilennummern bestimmt. Mit den Zeilennummern kann man Untermengen des Dataframes erstellen. Vielleicht hilft das hier besser:
Code: Alles auswählen
WSDede <- data.frame(Time = c("2:30 a", "3:00 a", "3:30 a", "4:00 a", "4:30 a", "5:00 a",
"5:30 a", "6:00 a", "6:30 a", "7:00 a", "7:30 a", "8:00 a", "8:30 a",
"9:00 a", "9:30 a", "10:00 a", "10:30 a", "11:00 a", "11:30 a",
"12:00 p", "12:30 p", "1:00 p", "1:30 p", "2:00 p", "2:30 p",
"3:00 p", "3:30 p", "4:00 p", "4:30 p", "5:00 p", "5:30 p", "6:00 p",
"6:30 p", "7:00 p", "7:30 p", "8:00 p", "8:30 p", "9:00 p", "9:30 p",
"10:00 p", "10:30 p", "11:00 p", "11:30 p", "12:00 a", "12:30 a",
"1:00 a", "1:30 a", "2:00 a", "2:30 a", "3:00 a"),
sonstiges = rnorm(50), zahlen = 1:50,
andere.Buchstaben = c(LETTERS, letters)[1:50],
stringsAsFactors = FALSE)
last.letter <- function(string){
l <- nchar(string)
substr(string, l, l)
}
a.rows <- which(last.letter(WSDede$Time) == "a")
p.rows <- which(last.letter(WSDede$Time) == "p")
WSDede.a <- WSDede[a.rows,]
WSDede.p <- WSDede[p.rows,]
head(WSDede.a)
head(WSDede.p)
HTH,
Bernhard
Re: Doppelte Einträge aus Zeile entfernen
Verfasst: Fr Jan 10, 2020 4:15 pm
von jogo
Hallo Max,
so ganz schlau bin ich jetzt noch nicht geworden bezüglich Deiner Anforderungen (gleiche Bedenken wie
Ruedi).
Deshalb frage ich ganz unbedarft zurück, Du meinst nicht zufällig:
Code: Alles auswählen
subset(WSDede, grepl("p$", Time)) # oder
subset(WSDede, grepl("a$", Time)) # oder
WSDede[grepl("p$", WSDede$Time), ]
Oder willst Du die Zeichenketten in $Time aufspalten in einen Teil mit den Uhrzeiten, z.B. "8:00" und einen zweiten Teil mit "a" oder "p"?
Code: Alles auswählen
Time <- c("2:30 a", "3:00 a", "3:30 a", "4:00 a", "4:30 a", "5:00 a",
"5:30 a", "6:00 a", "6:30 a", "7:00 a", "7:30 a", "8:00 a", "8:30 a",
"9:00 a", "9:30 a", "10:00 a", "10:30 a", "11:00 a", "11:30 a",
"12:00 p", "12:30 p", "1:00 p", "1:30 p", "2:00 p", "2:30 p",
"3:00 p", "3:30 p", "4:00 p", "4:30 p", "5:00 p", "5:30 p", "6:00 p",
"6:30 p", "7:00 p", "7:30 p", "8:00 p", "8:30 p", "9:00 p", "9:30 p",
"10:00 p", "10:30 p", "11:00 p", "11:30 p", "12:00 a", "12:30 a",
"1:00 a", "1:30 a", "2:00 a", "2:30 a", "3:00 a")
do.call(rbind, strsplit(Time, split=" "))
Gruß, Jörg
Re: Doppelte Einträge aus Zeile entfernen
Verfasst: Di Jan 14, 2020 11:42 am
von Effigy
ruedi_br hat geschrieben: Fr Jan 10, 2020 2:15 pm
Blöd nachgefragt: bei den Suffixen a und p handelt es sich doch um ante und post meridien, also vor und nach Mittags.
Ist das vom Datenmaterial wirklich sinnhaft, Messwerte von 8:30 zu nehmen und die von 20:30 wegfallen zu lassen?
VG
Ruedi
Oh man, ja du hattest recht.

Ich dachte, R hätte die Suffixe gemacht, um die doppelten Einträge kenntlich zu machen. Damit ändert sich natürlich der ganze Sachverhalt. Ich habe nun probiert mit
die doppelten Einträge zu entfernen, aber irgdendwas scheint nicht zu funktionieren. Der Dataframe WSDede_ud hat zwar nur noch 12693 observations statt den 15944 wie der von WSDede, aber trotzdem sind Einträge für die Monate Mai und Juni doppelt vorhanden und ich versteh daher nicht, was letztendlich entfernt wurde. Wenn ich mir den df angucke scheint alles normal zu sein.