我想创建一个包含一些统计数据的长表,例如样本、平均值和方差等。我正在使用该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 页的此类文档,并查看计算出的经验平均值和方差。
非常密切相关:
- 构建表时,如何在 foreach 或条件(或其他组/环境)中使用与号 (&)?
- 复制表行 n 次
- 使用 pgffor 中的 foreach 命令生成表
- 如何摆脱在 longtable 启动之前绘制的额外 \hline?
注意:这个问题已被大量编辑,因为显示出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}
以下是我longtable
500 次抽奖所得到的。
答案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}