2016-08-04 13 views
-1

Ich weiß, das wurde mehrmals gefragt, aber ich habe seit den letzten 2 Tagen im Internet gescrollt und kann nicht die Hilfe finden, die ich brauche, um eine Pivot-Tabelle oder Übersichtstabelle zu erstellen übertreffen. Ich bin völlig neu in R wie in einem vollständigen Analphabeten, so finde ich die meisten Beispiele in R-Paketen Hilfedateien viel zu kompliziert.Erstellen von Pivot-Tabelle in R

Ich habe eine Liste von Daten ("Assemblage"), die wie dieser

Phase class NISP 
    <chr> <chr> <int> 
1  L Aves 11 
2  L Fish 128 
3  L Mammals 14 
4  K Aves 63 
5  K Fish 30 
6  K Mammals 311 
7  J Aves 170 
8  J Fish 327 
9  J Mammals 740 
10  I Aves 45 
# ... with 18 more rows 

und ich habe es geschafft, zu tun, um eine Zusammenfassung/Pivot-Tabelle wie Tabelle mit dcast()

pivot <-dcast(assemblage, Phase ~ class, fun.aggregate = sum, value.var = "NISP", margins = TRUE) 
sieht mit folgendem Ergebnis

Phase Aves Fish Indeterminate Mammals (all) 
1  A 1 0    0  6  7 
2  B 2 0    0  3  5 
3  C 58 20    0  255 333 
4  E 5 2    0  5 12 
5  F 14 0    0  17 31 
6  H 121 154    1  784 1060 
7  I 45 110    0  149 304 
8  J 170 327    0  740 1237 
9  K 63 30    0  311 404 
10  L 11 128    0  14 153 
11 (all) 490 771    1 2284 3546 

Aber was ich brauche jetzt, dass ich nicht herausfinden kann, ist:

  • ersetzen (alle) mit "Total"
  • um Spalten, um folgende ("Phase", "Säugetiere", "Fisch", "Aves", "grenzwertig", "Total")
  • add neue Spalten mit Prozentsätzen jeder Tierklasse pro Phase (Prozentsatz der Zeilensumme).

Antwort

0

Der folgende Code sollte alles Schritt für Schritt erledigen. Wenn etwas unklar ist, lass es mich wissen.

# make some data 
df = data.frame(Phase = c(1, 1, 2, 2, 3), 
       Fish = floor(rnorm(5, 150)), 
       Mammal = floor(rnorm(5, 50))) 

df$all = rowSums(df[, 2:3]) 

# 1 change name 
names(df)[which(names(df) == 'all')] = 'Total' 

# 2 - reverse Fish and Mammal 
idx1 = 2:3 # columns to change 
idx2 = 3:2 # new order of columns 
df[, idx1] = df[, idx2] 
names(df)[idx1] = names(df)[idx2] 

# 3 - calculate percentages 
idxT = 2:3 # column indices of interest 

newColNames = paste('%', names(df)[idxT]) 

tmp = df[, idxT, drop = FALSE]/matrix(df["Total"], ncol = length(idxT)) 
colnames(tmp) = newColNames 
df = cbind(df, tmp) 
+0

Das ist toll danke, das macht fast alles. Es wird ein bisschen Aufräumen für den Import in Latex geben, aber für den Moment ist das in Ordnung. – scotgis

+0

Gut zu hören. Wenn Sie Latex mit APA-Richtlinien verwenden möchten, empfehle ich Ihnen, das R-Paket 'xtable' anzuschauen. Es hat eine Funktion "xtable", die eine Matrix oder einen Datenrahmen als Argument akzeptiert und eine APA-formatierte Latex-Tabelle zurückgibt. – Vandenman

+0

Klingt gut, danke, ich werde es ausprobieren! – scotgis