Seite 2 von 2

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

Verfasst: Do Jun 04, 2020 5:12 pm
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

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

Verfasst: Do Jun 04, 2020 8:03 pm
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

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

Verfasst: Do Jun 04, 2020 8:29 pm
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!

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

Verfasst: Do Jun 04, 2020 10:59 pm
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

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

Verfasst: Fr Jun 05, 2020 11:08 am
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

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

Verfasst: Fr Jun 05, 2020 11:14 am
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.

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

Verfasst: Fr Jun 05, 2020 11:21 am
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!

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

Verfasst: Fr Jun 05, 2020 2:19 pm
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...

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

Verfasst: Sa Aug 01, 2020 11:25 am
von evelyn92
Danke für den Tipp, Edi!