Seite 1 von 1

Werte einer Tabelle jeweils aggregieren

Verfasst: Fr Aug 10, 2018 11:18 am
von blacklabel5
Hallo liebes Forum,
vllt. kann mir jemand bei folgender Aufgabe helfen, ich quäle mich gerade mit meinen bescheidenen R-Kenntnissen und der Code ist nicht so überzeugend.
Es geht darum, in einer Tabelle Werte zu zählen, d.h. meine Tabelle hat z.B. 10 Spalten, 50 Zeilen und ab der 5ten bis zur letzten Spalte möchte ich die Ausprägung der Tabelle gestaffelt haben, ähnlich wie eine Pivottabelle:

Code: Alles auswählen

Spalte 1 | Spalte 2 ... | Spalte 5 ... | Spalte 10
abcdefe | abchufj | abcdefe | dfgergdrg
abcdefe | abchufj | abcdefe | dfgergdrg
...
Das Ergebnis sollte dann etwa so aussehen

Code: Alles auswählen

abcdefe 5
abchufj
...
Mit

Code: Alles auswählen

y <- aggregate(x$Spalte5, list(Spalte5=x$Spalte5), FUN=length)
kriege ich es schon mal für die Spalte 5 hin, aber der Rest?? Habe ich mit einer for-Schleife versucht, etwa so:

Code: Alles auswählen

# Anzahl Spalten herausfinden
a <- dim(x)
c <- a[2]

for (i in 5:c) {
y <- aggregate(x$Role[,i], list(Role=x$Role[,i]), FUN=length)
}
Fehlermeldung:

Code: Alles auswählen

Error in aggregate.data.frame(as.data.frame(x), ...) : 
  keine Zeile für die Aggregation
Hat jmd. vllt. eine elegantere Lösung oder kann mir weiterhelfen?

Viele Grüße und besten Dank

Re: Werte einer Tabelle jeweils aggregieren

Verfasst: Fr Aug 10, 2018 11:42 am
von jogo
Hallo blacklabel5,

willkommen im Forum!
Für das Zählen ist üblicherweise die Funktion table() zuständig. Du müsstest diese Funktion nur auf die entsprechenden Spalten des Dataframes anwenden, z.B.:

Code: Alles auswählen

lapply(x[-(1:4)], table)
Bei mir funktioniert:

Code: Alles auswählen

lapply(CO2[1:3], table)
(Der Dataframe CO2 gehört zum Standardlieferumfang von R.)

Gruß, Jörg
p.s.:
Bitte zukünftig beachten: viewtopic.php?f=20&t=29
- ich hab Deine erste Nachricht schon mal entsprechend überarbeitet.

Re: Werte einer Tabelle jeweils aggregieren

Verfasst: Fr Aug 10, 2018 12:00 pm
von blacklabel5
danke schön! kann man hier auf einzelne Spalten/Zeilen zugreifen oder die Zahlen entfernden, damit ich nur eine Übersicht über die Wörter habe, nach denen ich gestaffelt habe? Also dass es mir die Anzahl weglässt ?

Re: Werte einer Tabelle jeweils aggregieren

Verfasst: Fr Aug 10, 2018 12:02 pm
von jogo
na, klar. Nimm einfach die Funktion unique()

Code: Alles auswählen

lapply(x[-(1:4)], unique)

Re: Werte einer Tabelle jeweils aggregieren

Verfasst: Fr Aug 10, 2018 12:20 pm
von blacklabel5
dass man das alles mit so ein paar zeilen machen kann, überrascht mich schon sehr :o :o
nur noch eine sache, dann bist du schon erlöst :)
wenn ich mir die Daten dann in eine csv-Datei ausgeben möchte mit:

Code: Alles auswählen

beta <- lapply(x[-(1:4)], table)
beta
write.table(beta, "C:\\Users\\...\\File_9.csv",quote=FALSE, sep = ";")
kommt als Fehlermeldung:

Code: Alles auswählen

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 3, 5, 6
weißt du, wo der fehler liegt?
kann man sich das als tabelle mit einer spalte ausgeben lassen? also als liste?

Viele grüße

Re: Werte einer Tabelle jeweils aggregieren

Verfasst: Fr Aug 10, 2018 12:55 pm
von jogo
Das Ergebnis von lapply() ist eine Liste. Die Funktion write.table() kann aber nur Matrizen oder Dataframes verarbeiten.
... ich muss ein wenig basteln ...

Code: Alles auswählen

beta <- lapply(CO2[1:3], function(x) paste0(unique(as.character(x)), collapse=' '))
write.table(data.frame(Spalte=names(beta), Werte=unlist(beta)), "File_9.csv", quote=FALSE, sep = ";")
Hier noch eine Variante für die Erzeugung von beta:

Code: Alles auswählen

beta <- sapply(lapply(CO2[1:3], levels), paste, collapse=' ')
Gruß, Jörg

Re: Werte einer Tabelle jeweils aggregieren

Verfasst: Fr Aug 10, 2018 12:57 pm
von blacklabel5
vielen lieben dank! ohne das forum wäre ich schon längst weg vom fenster :lol: :lol:

kann ich jetzt noch irgendwo ein "unique" reinbasteln, damit es mir jedes Wort nur einmal ausgibt und gleichzeitig die ausgegebenen Werte in einer Spalte ausgeben lassen (und nicht zeilenweise)?

Re: Werte einer Tabelle jeweils aggregieren

Verfasst: Fr Aug 10, 2018 4:32 pm
von jogo
(habe Deine Frage erst sehr spät wahrgenommen)

Wie wäre es mit sowas:

Code: Alles auswählen

beta <- lapply(CO2[1:3], unique)
data.frame(Spalte=rep(names(beta), lengths(beta)), Werte=unlist(beta))
:?:

Gruß, Jörg

Re: Werte einer Tabelle jeweils aggregieren

Verfasst: Fr Aug 10, 2018 4:49 pm
von blacklabel5
kein problem, besser spät als nie
ja, perfekt, dass sieht gut aus!
du bist wirklich ein schatz