如何自动为统计作业创建表格?

如何自动为统计作业创建表格?

我想创建一个包含一些统计数据的长表,例如样本、平均值和方差等。我正在使用该pgf包及其各种扩展来执行此操作。

这是一个愚蠢的 MWE:

\documentclass{article}
\usepackage{pgf}
\usepackage{tikz}
\usepgflibrary{fpu}
\pgfmathsetseed{\number\pdfrandomseed}
\begin{document}
\xdef\Sum{0}
\xdef\Rand{0}
\xdef\Avg{0}
\xdef\Var{0}
\xdef\Sq{0}
%\begin{table}[h]
%\begin{tabular}{|c|c|c|c|c|c|}
%\hline
%Trial & Rand & Sum & Sum-of-squares & Average & Variance\\
%\hline\hline
%\noindent Trial Rand Sum Sum-of-squares Average Variance\\
\noindent\foreach \i in {1 ,...,15} {
    %\pgfkeys{/pgf/fpu,/pgf/fpu/output format=sci}
        \pgfmathparse{random(10)}
        \xdef\Rand{\pgfmathresult}
        \pgfkeys{/pgf/fpu,/pgf/fpu/output format=sci}
        \pgfmathparse{\Sum+\Rand}
        \xdef\Sum{\pgfmathresult}
        \pgfmathparse{\Sq+\Rand*\Rand}
        \xdef\Sq{\pgfmathresult}
        \pgfmathparse{\Sum/\i}
        \xdef\Avg{\pgfmathresult}
        \pgfmathparse{\Sq/\i-\Avg*\Avg}
        \xdef\Var{\pgfmathresult}
        \noindent \i,\                             %&%
        \pgfmathparse{\Rand}\pgfmathresult,\    %&%
        \pgfmathparse{\Sum}\pgfmathresult,\      %&%
        \pgfmathparse{\Sq}\pgfmathresult,         %&%
        \pgfmathparse{\Avg}\pgfmathresult,       %&%
        \pgfmathparse{\Var}\pgfmathresult        \\
        %\hline
        }
        %\end{tabular}
%\end{table}
\end{document}

以下是输出(取决于您获得的随机数):

在此处输入图片描述

如您所见,该表已被注释掉,因为我已放弃它。我想生成一个有 1000 页的此类文档,并查看计算出的经验平均值和方差。


非常密切相关:


注意:这个问题已被大量编辑,因为显示出XY问题。稍后我将在一个单独的问题中重新提出问题 X。

答案1

我怀疑你的问题构建表时,如何在 foreach 或条件(或其他组/环境)中使用与号 (&)? 属于XY类型。

这些情况下的常见问题是,您无法在语句中构建表格\foreach,因为表格单元格会形成组。策略是预先构建表格主体。

\documentclass{article}

\usepackage{booktabs,etoolbox}

\usepackage{pgf}
\usepackage{tikz}
\usepgflibrary{fpu}

\pgfmathsetseed{\number\pdfrandomseed}

\begin{document}

\def\Sum{0}
\def\Rand{0}
\def\Avg{0}
\def\Var{0}
\def\Sq{0}
\def\TableBody{}
\foreach \i in {1,...,15} {
  %\pgfkeys{/pgf/fpu,/pgf/fpu/output format=sci}
  \pgfmathparse{random(10)}
  \xdef\Rand{\pgfmathresult}
  \pgfkeys{/pgf/fpu,/pgf/fpu/output format=sci}
  \pgfmathparse{\Sum+\Rand}
  \xdef\Sum{\pgfmathresult}
  \pgfmathparse{\Sq+\Rand*\Rand}
  \xdef\Sq{\pgfmathresult}
  \pgfmathparse{\Sum/\i}
  \xdef\Avg{\pgfmathresult}
  \pgfmathparse{\Sq/\i-\Avg*\Avg}
  \xdef\Var{\pgfmathresult}
  \xappto\TableBody{\i & \Rand & \Sum & \Sq & \Avg & \Var \noexpand\\}
}

\begin{tabular}{ *{6}{c} }
\toprule
Trial & Rand & Sum & Sum-of-squares & Average & Variance \\
\midrule
\TableBody
\bottomrule
\end{tabular}

\end{document}

在此处输入图片描述

以下是我longtable500 次抽奖所得到的。

在此处输入图片描述

答案2

我不是专家,pgfplotstable但这是一个可以借鉴的想法。

要使条目更漂亮地对齐,请参阅Q131081

(我发现它pgfplotstable过于复杂,而且手册重复了 PGF 手册的部分内容,这肯定没有帮助……)

代码

\documentclass{article}
\usepackage{booktabs,pgfplotstable}
\pgfmathsetseed{\number\pdfrandomseed}
\pgfplotstableset{
  duck ini/.style={columns={Trial,Rand}},
  duck table/.style={
    columns={Trial,Rand,Sum,Sq,Avg,Var},
    set column name/.list={Sq:Sum-of-squared, Avg:Average, Var:Variance},
    every head row/.append style={before row=\toprule, after row=\midrule},
    every last row/.append style={after row=\bottomrule},
    set column/.list={Avg:prec=1, Var:prec=2}},
  set column name/.style args={#1:#2}{columns/#1/.append style={column name={#2}}},
  set column/.style args={#1:#2}{columns/#1/.append style={#2}},
  set expr/.style args={#1=#2}{create on use/#1/.style={create col/expr={#2}}}}
\pgfset{number format/prec/.style={fixed, fixed zerofill, precision={#1}}}
\pgfplotstableset{set expr/.list={Trial=\pgfplotstablerow+1,Rand=int(rnd*11)}}
\newcommand*\addmyusualcolumns[1]{%
  \pgfplotstablecreatecol[expr={\pgfmathaccuma+\thisrow{Rand}}]                           {Sum} #1
  \pgfplotstablecreatecol[expr={\pgfmathaccuma+\thisrow{Rand}*\thisrow{Rand}}]            {Sq}  #1
  \pgfplotstablecreatecol[expr={\thisrow{Sum}/\thisrow{Trial}}]                           {Avg} #1
  \pgfplotstablecreatecol[expr={\thisrow{Sq}/\thisrow{Trial}-\thisrow{Avg}*\thisrow{Avg}}]{Var} #1}
\begin{document}
\pgfplotstablenew[duck ini]{15}\t
\addmyusualcolumns\t
\pgfplotstabletypeset[duck table]\t

\pgfplotstablenew[duck ini]{30}\T
\addmyusualcolumns\T
\pgfplotstabletypeset[duck table]\T
\end{document}

相关内容