nur die ersten 3 Buchstaben der Wörter aus einer Spalte auswählen

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

Moderatoren: EDi, jogo

evelyn92
Beiträge: 18
Registriert: Sa Feb 15, 2020 5:48 pm

Re: nur die ersten 3 Buchstaben der Wörter aus einer Spalte auswählen

Beitrag von evelyn92 »

Danke nochmal!

Letztendlich habe ich es geschafft und zwar damit:

Code: Alles auswählen

library(stringr)
names = data.frame(Name = c("Evelyn Ersthofer","Peter Hietz"))
names$short = paste(substr(word(names$Name,1),1,3),substr(word(names$Name,2),1,3))
names$caps = toupper(names$short)
angewendet auf meine Daten sieht es dann so aus:

Code: Alles auswählen

library(stringr)
  names = data.frame(spec = data_19$spec)
  names$short = paste(substr(word(names$spec,1),1,3),substr(word(names$spec,2),1,3))
  names$caps = toupper(names$short)
Jetzt möchte ich aber die beiden Datentabellen "data_19" und "names" noch zusammenfügen, sodass die in "names" vorhandenen Spalten rechts an die Spalten von der Datentabelle "data_19" angefügt werden. Und diese neue Datentabelle soll "data_19_short_names heißen". Das müsste eigentlich ganz leicht gehen, aber ich übersehe irgendetwas und bin wirklich am verzweifeln, weil ich die Syntax kenne, aber es nicht schaffe, sie richtig an meine Daten anzuwenden. Ich sitze seit 2 Tagen daran und komme ohne konkrete Hilfe nicht weiter. Die Spalte "spec" haben sie gemeinsam, die soll in der fertigen Datentabelle nur einmal vorkommen.
Im Anhang sind Screenshots von den zwei Datentabellen, die ich zusammenfügen möchte.
names
names
data_19
data_19
Ich hab mir die Hilfe in R zur merge Funktion schon angeschaut und die lautet so:

Code: Alles auswählen

merge(x, y, by = intersect(names(x), names(y)),
      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
      sort = TRUE, suffixes = c(".x",".y"), no.dups = TRUE,
      incomparables = NULL,...)
Ich habe dann versucht, es auf meine Daten anzuwenden und das sah so aus:

Code: Alles auswählen

data_19_short_names = merge(data_19, names, by = intersect(names(x), names(y)),
      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
      sort = TRUE, suffixes = c(".x",".y"), no.dups = TRUE,
      incomparables = NULL)
Natürlich hab ich noch viel mehr verschiedene Varianten versucht, bin jetzt aber am Ende meiner Nerven, weil ich den Code beim besten Willen nicht so verstehe, dass ich ihn richtig anwenden kann. Was mach ich z.B. bei dem Teil mit den Suffixes? Damit kann ich nach all dem Nachlesen und ausprobieren immer noch nix anfangen.

Kann mir bitte jemand helfen?

Liebe Grüße,
Evy
Zuletzt geändert von jogo am Do Jun 04, 2020 7:51 pm, insgesamt 1-mal geändert.
Grund: Formatierung verbessert, siehe http://forum.r-statistik.de/viewtopic.php?f=20&t=29
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: nur die ersten 3 Buchstaben der Wörter aus einer Spalte auswählen

Beitrag von jogo »

Hallo Evy,

wenn Du alle Parameter so setzt wie in der Dokumentation im Abschnitt Usage beschrieben, dann wirst Du genau das gleiche Verhalten bekommen wie beim Weglassen der entsprechenden Parameter, denn in dem Teil sind die Standardwerte (defaults) beschrieben.
Welche Bedeutung die Setzung der Parameter hat, steht immer im Abschnitt Arguments. Eigentlich muss man sich nur für die Argumente (Parameter) interessieren, die für das gewünschte bzw. unerwünschte Verhalten zuständig sind - die hatte ich Dir genannt. Alles andere kannst Du bei den Standardwerten belassen.
Wenn Du meinem Vorschlag (mit merge()) folgen wolltest, müsste das so aussehen:

Code: Alles auswählen

data_19_short_names <- merge(data_19, names, all=TRUE)
Gruß, Jörg
evelyn92
Beiträge: 18
Registriert: Sa Feb 15, 2020 5:48 pm

Re: nur die ersten 3 Buchstaben der Wörter aus einer Spalte auswählen

Beitrag von evelyn92 »

Hallo Jörg!

Danke! Das habe ich als allererstes so probiert, aber da muss noch mehr dahinter stecken, denn es werden so zwar die Spalten angefügt, aber die Zeilen vervielfachen sich enorm. Das sieht man in dem Screenshot hier. In der Spalte IDtree sollte jede Zahl immer nur einmal vorkommen.
data_19_short_names.JPG
Wie kann ich das machen, dass das nicht passiert?

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

Re: nur die ersten 3 Buchstaben der Wörter aus einer Spalte auswählen

Beitrag von jogo »

Hallo Evy,

zu einer Vervielfachung von Zeilen kommt es, wenn Du es bei den Schlüsselwerten (by=...) nicht mehr mit einer 1:1-Zuordnung zu tun hast, sondern mit einer Zuordnung nach dem Schema 1:n oder m:n.

Beispiel:

Code: Alles auswählen

D <- data.frame(x=c("A", "A", "A", "B", "B", "C"), y=c(1,2,2,3,4,4), z1=1:6, stringsAsFactors = FALSE)
D
E <- data.frame(x=c("A", "A", "A", "B", "B", "C"), y=c(1,2,2,3,4,4), z2=101:106, stringsAsFactors = FALSE)
E
merge(D, E)
Bei dem Schlüssel ("A", 2) gibt es in beiden Tabellen zwei Datensätze - das ist eine 2:2-Zuordnung. Also gibt es im Ergebnis 4 Datensätze für diesen Schlüssel.
Jetzt möchte ich aber die beiden Datentabellen "data_19" und "names" noch zusammenfügen, sodass die in "names" vorhandenen Spalten rechts an die Spalten von der Datentabelle "data_19" angefügt werden. Und diese neue Datentabelle soll "data_19_short_names heißen".  

Code: Alles auswählen

data_19_short_names <- merge(names, data_19, all.y=TRUE)
Wenn Du jetzt im Ergebnis mehr Zeilen hast als Zeilen in data_19 sind, dann liegt das daran, dass in names manche Zeilen doppelt oder mehrfach vorkommen.

Wenn die Reihenfolge der Spezies in beiden Dataframes gleich ist (und auch die Anzahl der Datensätze), dann ist merge() nicht die geeignete Wahl. Dann solltest Du cbind() nehmen:

Code: Alles auswählen

data_19_short_names <- cbind(names, data_19)
Gruß, Jörg
evelyn92
Beiträge: 18
Registriert: Sa Feb 15, 2020 5:48 pm

Re: nur die ersten 3 Buchstaben der Wörter aus einer Spalte auswählen

Beitrag von evelyn92 »

Jaaaaa! Wunderbar! Es hat geklappt, DANKE!!!! cbind war das Richtige!!!

Eine kleine Frage noch dazu: Ich hab jetzt die Spalte "spec" doppelt drin, weil die in beiden data frames drin war. Was kann ich tun, dass sie nur einfach vorhanden ist in data_19_short_names?

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

Re: nur die ersten 3 Buchstaben der Wörter aus einer Spalte auswählen

Beitrag von jogo »

Hallo Evy,

Du musst die Spalte aus einem der zusammenzuklebenden Dataframes entfernen, z.B.

Code: Alles auswählen

data_19_short_names <- cbind(names[-1], data_19)
Gruß, Jörg
p.s.:
Es gibt in R auch eine Funktion names() - hoffentlich kommt es nicht zu Verwechslungen.
evelyn92
Beiträge: 18
Registriert: Sa Feb 15, 2020 5:48 pm

Re: nur die ersten 3 Buchstaben der Wörter aus einer Spalte auswählen

Beitrag von evelyn92 »

Super! Hat auch funktioniert!
Danke für den Hinweis bezüglich der Funktion names()! War bisher kein Problem, aber gut zu wissen!

Herzlichen Dank, Jörg!
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: nur die ersten 3 Buchstaben der Wörter aus einer Spalte auswählen

Beitrag von EDi »

Ich persönlich würde immer merge gegenüber cbind bevorzugen, der Sicherheit halber.

Außer man ist sich 100% sicher, dass die Zeilen gleich sortiert sind (und selbst dann beruhigt mich merge mehr).

just my 2 Cents,

Wollte nur sagen, dass man mit cbind vorsichtig sein sollte...
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.
evelyn92
Beiträge: 18
Registriert: Sa Feb 15, 2020 5:48 pm

Re: nur die ersten 3 Buchstaben der Wörter aus einer Spalte auswählen

Beitrag von evelyn92 »

Danke für den Tipp, Edi!
Antworten