2016-04-08 6 views
0

nehme ich an Datenrahmen haben als Arbeitsbereich in R ohne Verwendung von FOR-Schleifen in RWie führe ich mehrere Operationen für jede Spalte in Matrix in R durch, ohne FOR-Schleifen zu verwenden?

a b c d 
s 1 2 3 4 
t 2 4 5 6 
u 1 9 7 6 
v 9 2 3 4 
w 3 2 0 2 
x 3 2 0 9 
y 9 2 4 3 
z 8 3 4 5 

Wie kann ich automatisieren, um Bereich zu extrahieren, Mittelwert, Standardabweichung, Median, Maximum und Minimum für jede Spalte der Matrix folgt? Kann man apply/sapply/lapply ??

Antwort

0
apply(df, 2, summary) 
      a b c  d 
#Min. 1.00 2.00 0.00 2.000 
#1st Qu. 1.75 2.00 2.25 3.750 
#Median 3.00 2.00 3.50 4.500 
#Mean 4.50 3.25 3.25 4.875 
#3rd Qu. 8.25 3.25 4.25 6.000 
#Max. 9.00 9.00 7.00 9.000 
+2

Oder 'sapply (df, Zusammenfassung)'. Um die Entfernung zu erhalten, benutze 'sapply (df, range)'. –

+0

Schön, ich wusste nicht, dass 'sapply' das tat :) – Sotos

+0

Oder nur Zusammenfassung (df). Die Zusammenfassung bezieht sich auf alle Spalten. – Dave2e

0
fun <- c('mean', 'sd', 'median', 'min', 'max') 
sapply(fun, function(x) apply(dff, 2, match.fun(x))) 

Sie Ausgabe wie diese erhalten,

mean  sd median min max 
a 4.500 3.545621 3.0 1 9 
b 3.250 2.434866 2.0 2 9 
c 3.250 2.375470 3.5 0 7 
d 4.875 2.167124 4.5 2 9 
2

Es gibt ein paar verschiedene Optionen für diesen Fall. Andere haben die apply-Funktion erwähnt, aber apply funktioniert auf einer Matrix und wenn ein Datenrahmen angegeben wird, wird sie zuerst in eine Matrix umgewandelt, bevor die Funktion angewendet wird. Für den Beispieldatenrahmen ist dies kein Problem (aber es ist ineffizient, zuerst zu konvertieren), aber es könnte Probleme verursachen, wenn es mit einem Datenrahmen verwendet wird, der nicht-numerische Spalten enthält.

Besser ist sapply zu verwenden, die (und ein Datenrahmen ist eine Form einer Liste) direkt auf den Listen funktioniert:

> sapply(mtcars, function(x) c(mean(x), median(x), sd(x))) 
      mpg  cyl  disp  hp  drat  wt  qsec 
[1,] 20.090625 6.187500 230.7219 146.68750 3.5965625 3.2172500 17.848750 
[2,] 19.200000 6.000000 196.3000 123.00000 3.6950000 3.3250000 17.710000 
[3,] 6.026948 1.785922 123.9387 68.56287 0.5346787 0.9784574 1.786943 
      vs  am  gear carb 
[1,] 0.4375000 0.4062500 3.6875000 2.8125 
[2,] 0.0000000 0.0000000 4.0000000 2.0000 
[3,] 0.5040161 0.4989909 0.7378041 1.6152 

Sie können Sie auf jede Spalte berechnen je nachdem, welche Funktionen möchten, indem Sie die Funktion oben zu verändern.

Sie sollten auch das dplyr-Paket in Betracht ziehen, das Funktionen wie diese in einer Form hat, die etwas lesbarer ist und sich komplizierteren Fällen auf einfachere Weise anpasst.

> library(dplyr) 
> mtcars %>% summarise_each(funs(mean,median,sd)) 
    mpg_mean cyl_mean disp_mean hp_mean drat_mean wt_mean qsec_mean vs_mean 
1 20.09062 6.1875 230.7219 146.6875 3.596563 3.21725 17.84875 0.4375 
    am_mean gear_mean carb_mean mpg_median cyl_median disp_median hp_median 
1 0.40625 3.6875 2.8125  19.2   6  196.3  123 
    drat_median wt_median qsec_median vs_median am_median gear_median 
1  3.695  3.325  17.71   0   0   4 
    carb_median mpg_sd cyl_sd disp_sd hp_sd drat_sd  wt_sd 
1   2 6.026948 1.785922 123.9387 68.56287 0.5346787 0.9784574 
    qsec_sd  vs_sd  am_sd gear_sd carb_sd 
1 1.786943 0.5040161 0.4989909 0.7378041 1.6152 

> mtcars %>% summarise_each(funs(mean,median,sd)) %>% 
    matrix(nrow=ncol(mtcars), dimnames=list(names(mtcars), c('Mean','Median','SD'))) 
    Mean  Median SD  
mpg 20.09062 19.2 6.026948 
cyl 6.1875 6  1.785922 
disp 230.7219 196.3 123.9387 
hp 146.6875 123 68.56287 
drat 3.596563 3.695 0.5346787 
wt 3.21725 3.325 0.9784574 
qsec 17.84875 17.71 1.786943 
vs 0.4375 0  0.5040161 
am 0.40625 0  0.4989909 
gear 3.6875 4  0.7378041 
carb 2.8125 2  1.6152