Doppelte Einträge aus Zeile entfernen

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

Moderatoren: EDi, jogo

Effigy
Beiträge: 35
Registriert: Di Nov 26, 2019 11:44 am

Doppelte Einträge aus Zeile entfernen

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

Re: Doppelte Einträge aus Zeile entfernen

Beitrag 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
bigben
Beiträge: 2894
Registriert: Mi Okt 12, 2016 9:09 am

Re: Doppelte Einträge aus Zeile entfernen

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Effigy
Beiträge: 35
Registriert: Di Nov 26, 2019 11:44 am

Re: Doppelte Einträge aus Zeile entfernen

Beitrag 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
bigben
Beiträge: 2894
Registriert: Mi Okt 12, 2016 9:09 am

Re: Doppelte Einträge aus Zeile entfernen

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Effigy
Beiträge: 35
Registriert: Di Nov 26, 2019 11:44 am

Re: Doppelte Einträge aus Zeile entfernen

Beitrag 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
ruedi_br
Beiträge: 162
Registriert: Do Mär 01, 2018 3:53 pm

Re: Doppelte Einträge aus Zeile entfernen

Beitrag 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
fortune(111)
bigben
Beiträge: 2894
Registriert: Mi Okt 12, 2016 9:09 am

Re: Doppelte Einträge aus Zeile entfernen

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2093
Registriert: Fr Okt 07, 2016 8:25 am

Re: Doppelte Einträge aus Zeile entfernen

Beitrag 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
Effigy
Beiträge: 35
Registriert: Di Nov 26, 2019 11:44 am

Re: Doppelte Einträge aus Zeile entfernen

Beitrag 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. :oops: 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

Code: Alles auswählen

WSDede_ud <- WSDede %>% distinct()
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.
Antworten