2016-06-14 20 views
0

Ich habe die wie folgt aussieht: für Tausende von ZeilenGet Spaltennamen und Frequenz aus einer Tabelle, die wie eine Matrix, die eine Daten sieht Rahmen

'Part Number' 'Person Working' 
'A'   'James' 
'B'   'Brian' 
'A'   'Andrea' 
'C'   'Tiffany' 

und so weiter. Diesem Teil können mehrere Personen zugewiesen sein. Ich bin mir ziemlich schlecht an Daten in R zusammenfasst, aber ich bin in der Lage (in der Konsole) eine Tabelle zu erzeugen, die durch die Eingabe wie eine Frequenzmatrix aussieht:

table(df$partnumber, df$personworking) 

und es spuckt einzigartige Gegenstände wie Zeilen und jede Person arbeitet als Spalte. Die Werte sind eine 0 oder eine 1, abhängig davon, ob sie diesen Teil bearbeiten.

Was ich suche ist eine Möglichkeit, diese Informationen in einem verdaulichen Format zusammenfassen, die, pro Artikel sagt:

Part Number NumWorkers Names 
A    3    "James, Andrea" 
B    1    "Brian" 
C    1    "Tiffany" 

Ich bin auch mit immer meinen Tisch in einen Datenrahmen zu kämpfen. Ich habe versucht:

thedataframe <- data.frame(thetable[,]) 

aber ich bin nicht sehr weit. Ich möchte die Anzahl der Personen, die jedes einzelne Teil bearbeiten, zusammenfassen und jeden Spaltennamen, der eine Eins als Wert für ein bestimmtes Teil hat, zusammenfassen und ausdrucken.

Was ist der beste Weg, um diese Daten in Base R zusammenzufassen?

+0

Was mit meinen Methoden falsch? – akrun

Antwort

0

Hier verwenden ist eine Methode, die Sie in der Basis R mit aggregate verwenden:

dfAgg <- do.call(data.frame, 
      aggregate(df$Person, list(df$Parts), 
        FUN=function(x) c(length(x), paste(x, collapse=", ")))) 
# add nicer names 
names(dfAgg) <- c("Parts", "Count", "Person") 

Mit Aggregat können Sie eine Funktion über Gruppen ausführen. In diesem Fall führen wir eine Funktion aus, die sowohl die Anzahl der Personen (über length) als auch deren Namen (über paste) zurückgibt.

Hier sind die Beispieldaten, die ich verwendet habe, um dies zu testen.

Daten

set.seed(1234) 
df <- data.frame("Parts"=sample(LETTERS[1:3], 10, replace=T), 
        "Person"=sample(c("James", "Brian", "Sam", "Tiff", "Sandy"), 
            10, replace=T), stringsAsFactors=F) 
0

Wir können data.table verwenden. Konvertieren Sie den 'data.frame' in 'data.table' (setDT(df)), gruppiert nach 'partnumber', erhalten Sie die Anzahl der Zeilen (.N) und paste die 'personworking' in jeder 'partnumber'.

library(data.table) 
setDT(df)[,.(NumWorkers = .N, Names = toString(personworking)) , by = partnumber] 

oder könnten wir dplyr

library(dplyr) 
df %>% 
    group_by(partnumber) %>% 
    summarise(NumWorkers = n(), Names = toString(personworking)) 

Oder mit base R

do.call(rbind, by(df, df$partnumber, FUN = function(x) 
    data.frame(NumWorkers = length(x$personworking), Names = toString(x$personworking))))