Firmen einzeln auflisten, Subfirmen spaltenweise zuordnen

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

Moderatoren: EDi, jogo

Antworten
leonard_24

Firmen einzeln auflisten, Subfirmen spaltenweise zuordnen

Beitrag von leonard_24 »

Hallo liebes Forum,

ich bräuchte mal wieder fachlichen Rat bei einem Problem:
Ich habe eine Exceldatei mit Unternehmensdaten eingelesen, x (2 Spalten, 20.000 Zeilen)
In der Exceldateien gibt es das Feld "Firmen ID" (Spalte 2), wodurch ein eindeutige Zuordnung mgl. ist, diese kann jedoch mehrfach vorkommen, da in der Spalte zuvor (Spalte 1) die dazugehörigen Subcompanies aufgeführt sind. Also etwa so:

Code: Alles auswählen

Subfirma | Firmen ID 
a GmbH | 12345 
b GmbH | 12345 
c AG | 98745 
d AG | 98745 
...
Die Aufgabe besteht nun darin, die Firmen ID´s jeweils nur 1 mal aufzuführen, allerdings sollen die Subfirmen (ich weiß nicht, wie viele Subfirmen zu einer Firma gehören) spaltenweise hinter der jeweiligen Firmen ID aufgelistet werden, in etwa so:

Code: Alles auswählen

Firmen ID | Subcompany 1 | Subcompany 2 ...
12345 | a GmbH | b GmbH ...
98745 | c AG | d AG ...
...
Als erstes hätte ich einen neuen Dataframe "z" erstellt, der mir die unique Firmen ID´s ausgibt:

Code: Alles auswählen

z <- data.frame(x$Firmen.ID)
z <- unique(z)
Als nächstes hätte ich eine while-Schleife gebastelt, die in dem data.frame "x" durchgeht und die einzelnen Subfirmen den Firmen ID´s in dem neuen Vektor z zuordnet...

Mein Code: Von der Logik her, soll er durch die Zeilen der Spalte Firmen ID gehen (Spalte 2), so lange, wie sie !=0 ist. Wenn der Wert der vorherigen Zelle dem der jetzigen entspricht, heißt das, dass es mehrere Subfirmen gibt. Die sollen dann jeweils in eine eigene Spalte (Laufvariable r=3; d.h. wenn es z.B. 2 Subfirmen gibt, werden diese in Spalte 3 und 4 der entsprechenden Zeile geschrieben) geschrieben werden. Falls das nicht der Fall ist, wird r wieder auf 3 gesetzt (d.h. die 3te Spalte):

Code: Alles auswählen

i <- 1
r<- 3

while(x[i,2] !=0) {
  if (x[i,2] == x[i-1,2]) {
    z[i,r] == x[i,1]
    i <- i+1
  }
  else {
    r <- 3
    i <- i+1
  }
}
Dabei breche ich mir aber gerade alles ab :((( Es kommt "+" anstelle von ">" in der Konsole
Zusätzlich kommt die Fehlermeldung:

Code: Alles auswählen

Error in if (x[i, 2] == x[i - 1, 2]) { : argument is of length zero
Hat jmd. vllt. einen Weg der einfacher ist?

Besten Dank und viele Grüße
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Firmen einzeln auflisten, Subfirmen spaltenweise zuordnen

Beitrag von bigben »

leonard_24 hat geschrieben: Fr Aug 17, 2018 2:28 pm Es kommt "+" anstelle von ">" in der Konsole
Das liegt an der äußersten geschweiften Klammer und schadet erstmal nichts.
Error in if (x[i, 2] == x[i - 1, 2]) { : argument is of length zero
Du startest mit i == 1 und greift dann auf i - 1 zu. Letzteres ist Null und das kommt in R-Vektoren nunmal nicht. in R wird von 1 an gezählt. Ist ja schließlich nicht C++ oder Java.

Bitte benutze code-Tags!

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Firmen einzeln auflisten, Subfirmen spaltenweise zuordnen

Beitrag von jogo »

Bei SO wurde das Problem bereits gelöst. Ich habe jetzt nur keine Zeit zum Suchen.
...
Ich habe mir die Aufgabenstellung nochmal gründlich durchgelesen und festgestellt, dass es einfach ein reshape ist (long to wide)
https://stackoverflow.com/questions/589 ... ide-format
Trotzdem: reshape() ist eine Funktion, deren Parametersetzung ich noch immer nicht vollständig durchschaut habe.
... deshalb glaube ich, dass man auch gut tapply() o.ä. einsetzen könnte, um das Ziel zu erreichen.
... und bevor ich mich weiter mit reshape() rumquäle:

Code: Alles auswählen

A <- read.table(header=TRUE, stringsAsFactors = FALSE, sep='|', strip.white = TRUE,  text=
"Subfirma | FirmenID 
a GmbH | 12345 
cc GmbH | 12345
b GmbH | 12345 
c AG | 98745 
d AG | 98745")
tapply(A$Subfirma, A$FirmenID, paste0, collapse=";")
ok, das ist jetzt noch nicht ganz die gewünschte Struktur, aber es ist ein erster Ansatz.
nächste Stufe:

Code: Alles auswählen

tapply(A$Subfirma, A$FirmenID, FUN=function(x) paste0(sort(unique(x)), collapse=";"))
Man kann es auch als Liste gnerieren:

Code: Alles auswählen

tapply(A$Subfirma, A$FirmenID, FUN=function(x) list(sort(unique(x))))
was mich auf die Idee bringt:
wenn man jetzt noch weiter rumstochern will, müsste das Ergebnis eine char-Matrix sein.
...
So, fertig:

Code: Alles auswählen

A <- read.table(header=TRUE, stringsAsFactors = FALSE, sep='|', strip.white = TRUE,  text=
"Subfirma | FirmenID 
a GmbH | 12345 
cc GmbH | 12345
b GmbH | 12345 
c AG | 98745 
d AG | 98745")
xT <- tapply(A$Subfirma, A$FirmenID, FUN=function(x) list(sort(unique(x))))
sapply(xT, '[', 1:max(lengths(xT))) ## bzw.:
t(sapply(xT, '[', 1:max(lengths(xT))))
Gruß, Jörg
leonard_24

Re: Firmen einzeln auflisten, Subfirmen spaltenweise zuordnen

Beitrag von leonard_24 »

hallo Jörg,

funktioniert perfekt! und wesentlich einfacher als die Schleife :o
vielen dank!!
Antworten