Werte einer Tabelle jeweils aggregieren

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

Moderatoren: EDi, jogo

Antworten
blacklabel5

Werte einer Tabelle jeweils aggregieren

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

Re: Werte einer Tabelle jeweils aggregieren

Beitrag 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.
blacklabel5

Re: Werte einer Tabelle jeweils aggregieren

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

Re: Werte einer Tabelle jeweils aggregieren

Beitrag von jogo »

na, klar. Nimm einfach die Funktion unique()

Code: Alles auswählen

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

Re: Werte einer Tabelle jeweils aggregieren

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

Re: Werte einer Tabelle jeweils aggregieren

Beitrag 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
blacklabel5

Re: Werte einer Tabelle jeweils aggregieren

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

Re: Werte einer Tabelle jeweils aggregieren

Beitrag 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
blacklabel5

Re: Werte einer Tabelle jeweils aggregieren

Beitrag von blacklabel5 »

kein problem, besser spät als nie
ja, perfekt, dass sieht gut aus!
du bist wirklich ein schatz
Antworten