Usando "st" (https://github.com/nferraz/st)
$ st numbers.txt
N min max sum mean stddev
10 1 10 55 5.5 3.02765
O:
$ st numbers.txt --transpose
N 10
min 1
max 10
sum 55
mean 5.5
stddev 3.02765
(DESCARGO DE RESPONSABILIDAD:Escribí esta herramienta :))
Para el promedio, la mediana y la desviación estándar, puede usar awk
. Esto generalmente será más rápido que R
soluciones Por ejemplo, lo siguiente imprimirá el promedio :
awk '{a+=$1} END{print a/NR}' myfile
(NR
es un awk
variable para el número de registros, $1
significa el primer argumento (separado por espacios) de la línea ($0
sería la línea completa, que también funcionaría aquí pero en principio sería menos segura, aunque para el cálculo probablemente solo tomaría el primer argumento de todos modos) y END
significa que los siguientes comandos se ejecutarán después de haber procesado todo el archivo (también se podría haber inicializado a
a 0
en un BEGIN{a=0}
declaración)).
Aquí hay un awk
simple secuencia de comandos que proporciona estadísticas más detalladas (toma un archivo CSV como entrada; de lo contrario, cambie FS
) :
#!/usr/bin/awk -f
BEGIN {
FS=",";
}
{
a += $1;
b[++i] = $1;
}
END {
m = a/NR; # mean
for (i in b)
{
d += (b[i]-m)^2;
e += (b[i]-m)^3;
f += (b[i]-m)^4;
}
va = d/NR; # variance
sd = sqrt(va); # standard deviation
sk = (e/NR)/sd^3; # skewness
ku = (f/NR)/sd^4-3; # standardized kurtosis
print "N,sum,mean,variance,std,SEM,skewness,kurtosis"
print NR "," a "," m "," va "," sd "," sd/sqrt(NR) "," sk "," ku
}
Es sencillo agregar min/max a este script, pero es igual de fácil canalizar sort
&head
/tail
:
sort -n myfile | head -n1
sort -n myfile | tail -n1
Esto es muy fácil con R. Para un archivo que se ve así:
1
2
3
4
5
6
7
8
9
10
Usa esto:
R -q -e "x <- read.csv('nums.txt', header = F); summary(x); sd(x[ , 1])"
Para obtener esto:
V1
Min. : 1.00
1st Qu.: 3.25
Median : 5.50
Mean : 5.50
3rd Qu.: 7.75
Max. :10.00
[1] 3.02765
- El
-q
bandera silencia la licencia de inicio de R y la salida de ayuda - El
-e
flag le dice a R que pasará una expresión desde la terminal x
es undata.frame
- una mesa, básicamente. Es una estructura que acomoda múltiples vectores/columnas de datos, lo cual es un poco peculiar si solo estás leyendo en un solo vector. Esto tiene un impacto en las funciones que puede usar.- Algunas funciones, como
summary()
, acomoda naturalmentedata.frames
. Six
tenía múltiples campos,summary()
proporcionaría las estadísticas descriptivas anteriores para cada uno. - Pero
sd()
solo puede tomar un vector a la vez, por lo que indexox
para ese comando (x[ , 1]
devuelve la primera columna dex
). Podrías usarapply(x, MARGIN = 2, FUN = sd)
para obtener los SD de todas las columnas.