私はしばしば、1行に1つの番号を持つファイルを見つけます。中央値、標準偏差などを表示するために、Excelにインポートします。
同じことをするコマンドラインユーティリティがLinuxにありますか?通常、平均、中央値、最小値、最大値、標準偏差を見つける必要があります。
これはRで簡単です。このようなファイルの場合:
_1
2
3
4
5
6
7
8
9
10
_
これを使って:
_R -q -e "x <- read.csv('nums.txt', header = F); summary(x); sd(x[ , 1])"
_
これを取得するには:
_ V1
Min. : 1.00
1st Qu.: 3.25
Median : 5.50
Mean : 5.50
3rd Qu.: 7.75
Max. :10.00
[1] 3.02765
_
編集して、いくつかの明確なコメントを追加します(私はこれに戻って、その根拠の一部を覚えていなかったため):
-q
_フラグは、Rの起動ライセンスとヘルプ出力を抑制します-e
_フラグは、ターミナルから式を渡すことをRに伝えますx
は_data.frame
_-基本的にはテーブルです。これは、データの複数のベクトル/列に対応する構造であり、単一のベクトルを読み取るだけの場合は少し独特です。これは、使用できる機能に影響を与えます。summary()
などの一部の関数は、当然_data.frames
_に対応します。 x
に複数のフィールドがある場合、summary()
はそれぞれについて上記の統計情報を提供します。sd()
は一度に1つのベクトルしか取得できないため、そのコマンドに対してx
をインデックス付けします(_x[ , 1]
_はx
の最初の列を返します)。 apply(x, MARGIN = 2, FUN = sd)
を使用して、すべての列のSDを取得できます。「st」の使用( https://github.com/nferraz/st )
$ st numbers.txt
N min max sum mean stddev
10 1 10 55 5.5 3.02765
または:
$ st numbers.txt --transpose
N 10
min 1
max 10
sum 55
mean 5.5
stddev 3.02765
(免責事項:私はこのツールを書きました:))
平均、中央値、標準偏差には、awk
を使用できます。通常、これはR
ソリューションよりも高速です。たとえば、以下は平均値を出力しますwill:
awk '{a+=$1} END{print a/NR}' myfile
(NR
はレコード数のawk
変数です。$1
は行の最初の(スペースで区切られた)引数を意味します($0
は行全体になりますここでも機能しますが、原則として安全性は低くなりますが、計算ではおそらく最初の引数を取るだけです)END
は、ファイル全体を処理した後に次のコマンドが実行されることを意味します( 0
ステートメントでa
をBEGIN{a=0}
に初期化することもできます)。
以下に、より詳細な統計情報を提供する簡単なawk
スクリプトを示します(CSVファイルを入力として使用し、それ以外の場合は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
}
このスクリプトにmin/maxを追加するのは簡単ですが、sort
&head
/tail
をパイプするのも簡単です。
sort -n myfile | head -n1
sort -n myfile | tail -n1
Y A。 ASCIIモードはministatです。これはFreeBSDからのツールですが、Debian/Ubuntu。
使用例:
$ cat test.log
Handled 1000000 packets.Time elapsed: 7.575278
Handled 1000000 packets.Time elapsed: 7.569267
Handled 1000000 packets.Time elapsed: 7.540344
Handled 1000000 packets.Time elapsed: 7.547680
Handled 1000000 packets.Time elapsed: 7.692373
Handled 1000000 packets.Time elapsed: 7.390200
Handled 1000000 packets.Time elapsed: 7.391308
Handled 1000000 packets.Time elapsed: 7.388075
$ cat test.log| awk '{print $5}' | ministat -w 74
x <stdin>
+--------------------------------------------------------------------------+
| x |
|xx xx x x x|
| |__________________________A_______M_________________| |
+--------------------------------------------------------------------------+
N Min Max Median Avg Stddev
x 8 7.388075 7.692373 7.54768 7.5118156 0.11126122
うん、それはPerlと呼ばれています
そしてここに簡潔なワンライナーがあります:
Perl -e 'use List::Util qw(max min sum); @a=();while(<>){$sqsum+=$_*$_; Push(@a,$_)}; $n=@a;$s=sum(@a);$a=$s/@a;$m=max(@a);$mm=min(@a);$std=sqrt($sqsum/$n-($s/$n)*($s/$n));$mid=int @a/2;@srtd=sort @a;if(@a%2){$med=$srtd[$mid];}else{$med=($srtd[$mid-1]+$srtd[$mid])/2;};print "records:$n\nsum:$s\navg:$a\nstd:$std\nmed:$med\max:$m\min:$mm";'
例
$ cat tt
1
3
4
5
6.5
7.
2
3
4
そして、コマンド
cat tt | Perl -e 'use List::Util qw(max min sum); @a=();while(<>){$sqsum+=$_*$_; Push(@a,$_)}; $n=@a;$s=sum(@a);$a=$s/@a;$m=max(@a);$mm=min(@a);$std=sqrt($sqsum/$n-($s/$n)*($s/$n));$mid=int @a/2;@srtd=sort @a;if(@a%2){$med=$srtd[$mid];}else{$med=($srtd[$mid-1]+$srtd[$mid])/2;};print "records:$n\nsum:$s\navg:$a\nstd:$std\nmed:$med\max:$m\min:$mm";'
records:9
sum:35.5
avg:3.94444444444444
std:1.86256162380447
med:4
max:7.
min:1
平均:
awk '{sum += $1} END {print "mean = " sum/NR}' filename
中央値:
gawk -v max=128 '
function median(c,v, j) {
asort(v,j)
if (c % 2) return j[(c+1)/2]
else return (j[c/2+1]+j[c/2])/2.0
}
{
count++
values[count]=$1
if (count >= max) {
print median(count,values); count=0
}
}
END {
print "median = " median(count,values)
}
' filename
モード:
awk '{c[$1]++} END {for (i in count) {if (c[i]>max) {max=i}} print "mode = " max}' filename
このモードの計算には偶数個のサンプルが必要ですが、どのように機能するかがわかります...
標準偏差:
awk '{sum+=$1; sumsq+=$1*$1} END {print "stdev = " sqrt(sumsq/NR - (sum/NR)**2)}' filename
data_hacks
はPython基本的な統計のためのコマンドラインユーティリティ。
そのページの最初の例では、目的の結果が生成されます。
$ cat /tmp/data | histogram.py
# NumSamples = 29; Max = 10.00; Min = 1.00
# Mean = 4.379310; Variance = 5.131986; SD = 2.265389
# each * represents a count of 1
1.0000 - 1.9000 [ 1]: *
1.9000 - 2.8000 [ 5]: *****
2.8000 - 3.7000 [ 8]: ********
3.7000 - 4.6000 [ 3]: ***
4.6000 - 5.5000 [ 4]: ****
5.5000 - 6.4000 [ 2]: **
6.4000 - 7.3000 [ 3]: ***
7.3000 - 8.2000 [ 1]: *
8.2000 - 9.1000 [ 1]: *
9.1000 - 10.0000 [ 1]: *
念のため、 datastat
があります。これは、コマンドラインから単純な統計を計算するLinux用の単純なプログラムです。例えば、
cat file.dat | datastat
file.datの各列のすべての行の平均値を出力します。標準偏差、最小、最大を知る必要がある場合は、--dev
、--min
および--max
オプション。
datastat
には、1つ以上の「キー」列の値に基づいて行を集約する可能性があります。例えば、
cat file.dat | datastat -k 1
最初の列(「キー」)にある異なる値ごとに、キーの同じ値を持つすべての行で集計された他のすべての列値の平均を生成します。キーフィールドとしてより多くの列を使用できます(例:-k 1-3、-k 2,4など)。
C++で書かれており、高速でメモリ使用量が少なく、cut
、grep
、sed
、sort
などの他のツールでうまくパイプできます。 、awk
など。
clistats の使用を検討することもできます。区切り文字で区切られた入力番号のストリームの統計を計算するための高度に構成可能なコマンドラインインターフェイスツールです。
注:私は著者です。
私はシェルパイプラインでこれを行いたいと思っていましたが、Rのすべての適切な引数を取得するにはしばらく時間がかかりました。ここに私が思いついたものがあります:
seq 10 | R --slave -e 'x <- scan(file="stdin",quiet=TRUE); summary(x)' Min. 1st Qu. Median Mean 3rd Qu. Max. 1.00 3.25 5.50 5.50 7.75 10.00
--slave
オプション "Rをできるだけ静かに実行します... --quietおよび--no-saveを意味します。"-e
オプションはRに通知します次の文字列をRコードとして処理します。最初のステートメントは標準入力から読み取り、読み取ったものを「x」という変数に格納します。 scan
関数のquiet=TRUE
オプションは、読み取られたアイテムの数を示す行の書き込みを抑制します。 2番目のステートメントは summary
関数をx
に適用し、出力を生成します。
さらに別のツール: https://www.gnu.org/software/datamash/
# Example: calculate the sum and mean of values 1 to 10:
$ seq 10 | datamash sum 1 mean 1
55 5.5
より一般的にパッケージ化される可能性があります(少なくともnix用にプリパッケージ化された最初のツール)
Simple-rもあります。これは、Rができることのほとんどすべてを実行できますが、キーストロークは少なくて済みます。
https://code.google.com/p/simple-r/
基本的な記述統計を計算するには、次のいずれかを入力する必要があります。
r summary file.txt
r summary - < file.txt
cat file.txt | r summary -
平均、中央値、最小値、最大値、標準偏差のそれぞれについて、コードは次のようになります。
seq 1 100 | r mean -
seq 1 100 | r median -
seq 1 100 | r min -
seq 1 100 | r max -
seq 1 100 | r sd -
Simple-Rを取得しません!
#!/usr/bin/Perl
#
# stdev - figure N, min, max, median, mode, mean, & std deviation
#
# pull out all the real numbers in the input
# stream and run standard calculations on them.
# they may be intermixed with other test, need
# not be on the same or different lines, and
# can be in scientific notion (avagadro=6.02e23).
# they also admit a leading + or -.
#
# Tom Christiansen
# [email protected]
use strict;
use warnings;
use List::Util qw< min max >;
#
my $number_rx = qr{
# leading sign, positive or negative
(?: [+-] ? )
# mantissa
(?= [0123456789.] )
(?:
# "N" or "N." or "N.N"
(?:
(?: [0123456789] + )
(?:
(?: [.] )
(?: [0123456789] * )
) ?
|
# ".N", no leading digits
(?:
(?: [.] )
(?: [0123456789] + )
)
)
)
# abscissa
(?:
(?: [Ee] )
(?:
(?: [+-] ? )
(?: [0123456789] + )
)
|
)
}x;
my $n = 0;
my $sum = 0;
my @values = ();
my %seen = ();
while (<>) {
while (/($number_rx)/g) {
$n++;
my $num = 0 + $1; # 0+ is so numbers in alternate form count as same
$sum += $num;
Push @values, $num;
$seen{$num}++;
}
}
die "no values" if $n == 0;
my $mean = $sum / $n;
my $sqsum = 0;
for (@values) {
$sqsum += ( $_ ** 2 );
}
$sqsum /= $n;
$sqsum -= ( $mean ** 2 );
my $stdev = sqrt($sqsum);
my $max_seen_count = max values %seen;
my @modes = grep { $seen{$_} == $max_seen_count } keys %seen;
my $mode = @modes == 1
? $modes[0]
: "(" . join(", ", @modes) . ")";
$mode .= ' @ ' . $max_seen_count;
my $median;
my $mid = int @values/2;
if (@values % 2) {
$median = $values[ $mid ];
} else {
$median = ($values[$mid-1] + $values[$mid])/2;
}
my $min = min @values;
my $max = max @values;
printf "n is %d, min is %g, max is %d\n", $n, $min, $max;
printf "mode is %s, median is %g, mean is %g, stdev is %g\n",
$mode, $median, $mean, $stdev;
別のツール:tsv-summarize
、from eBayのtsvユーティリティ 。最小、最大、平均、中央値、標準偏差がすべてサポートされています。大規模なデータセットを対象としています。例:
$ seq 10 | tsv-summarize --min 1 --max 1 --median 1 --stdev 1
1 10 5.5 3.0276503541
免責事項:私は著者です。
xsv を使用:
$ echo '3 1 4 1 5 9 2 6 5 3 5 9' |tr ' ' '\n' > numbers-one-per-line.csv
$ xsv stats -n < numbers-one-per-line.csv
field,type,sum,min,max,min_length,max_length,mean,stddev
0,Integer,53,1,9,1,1,4.416666666666667,2.5644470922381863
# mode/median/cardinality not shown by default since it requires storing full file in memory:
$ xsv stats -n --everything < numbers-one-per-line.csv | xsv table
field type sum min max min_length max_length mean stddev median mode cardinality
0 Integer 53 1 9 1 1 4.416666666666667 2.5644470922381863 4.5 5 7