![使用 pgfplotstable 构建统计数据](https://linux22.com/image/370374/%E4%BD%BF%E7%94%A8%20pgfplotstable%20%E6%9E%84%E5%BB%BA%E7%BB%9F%E8%AE%A1%E6%95%B0%E6%8D%AE.png)
我正在尝试在表上建立某种统计数据,如以下代码所示:
\documentclass{standalone}
\usepackage{pgfplotstable}
\usepackage{booktabs, colortbl}
\usetikzlibrary{patterns}
\pgfplotstableset{col sep=semicolon, use comma, fixed, set thousands separator={},
every even row/.style={before row={\rowcolor[gray]{0.9}}},
every head row/.style={before row=\toprule, after row=\midrule},
every last row/.style={after row=\bottomrule}}
\newcommand{\sumoccurence}[3]{
% #1=table
% #2=column
% #3=value
\def\colsum{0}
\pgfplotstableforeachcolumnelement{#2}\of#1\as\cell{
\ifdim\cell pt=#3 pt
\pgfmathsetmacro\colsum{\colsum+1}
\fi
}
\colsum
}
\newcommand{\addstatisticcol}[5]{ %
% #1=table name to count
% #2=column name to count
% #3=table to add column
% #4=column mith marks
% #5=name of new column
% Sums for each column
%Should read from table #1 the column #2 and count for each mark in table #3 in column #4 and add a new column #5
\pgfplotstablecreatecol[
create col/assign/.code={%
\def\entry{}
%\xdef\entry{
%\xdef\entry{\sumoccurence{#1}{#2}{\thisrowno{#2}}
%\xdef\entry{\sumoccurence{#1}{#2}{2.0}}
\xdef\entry{\thisrow{#4}}
\pgfkeyslet{/pgfplots/table/create col/next content}\entry
}
]{#5}#3
}
%
\begin{document}
\pgfplotstableread{
ID; Mark
1010121; 1.0
1010122; 1.0
1010123; 5.0
1010124; 5.0
1010125; 3.0
1010126; 4.0
1010127; 2.7
}\Marks
\pgfplotstableread{
Marks; Count
1.0; 2
1.3; 0
1.7; 0
2.0; 0
2.3; 0
2.7; 1
3.0; 1
3.3; 0
3.7; 0
4.0; 1
4.7; 0
5.0; 2
}\Statistic
%Original Table
\pgfplotstabletypeset[columns={ID, Mark},
columns/Mark/.style={numeric type, fixed zerofill, precision=1}]\Marks
% \hspace{1cm}
%Statistic how it should be
\pgfplotstabletypeset[
columns={Marks, Count},
columns/Marks/.style={numeric type, fixed zerofill, precision=1}]\Statistic
%Creating a new Table for the statistic
\pgfplotstablenew[create on use/Marks/.style={create col/set list={1.0,1.3,1.7,2.0,2.3,2.7,3.0,3.3,3.7,4.0,4.7,5.0}}, columns={Marks},]{12}\loadedtable
%Adding an automatically calculated column for count of each mark
\addstatisticcol{\Marks}{Mark}{\loadedtable}{Marks}{Count}
%Current result with just a copy of the first column
\pgfplotstabletypeset[
columns={Marks, Count},
columns/Marks/.style={numeric type, fixed zerofill, precision=1}]\loadedtable
\end{document}
我能够创建一个命令来计算给定值的所有出现次数 (\sumoccurences)。但当我尝试在 \addstatisticcol 等新命令中使用此命令时,它不起作用。我收到很多错误,例如
未定义控制序列。 ...Noten}{注释}{\loadedtable}{Noten}{Anzahl}
并且喜欢
\pgfutil@in@@ 的参数有一个额外的}。 ...Noten}{注释}{\loadedtable}{Noten}{Anzahl}
希望有人能给我一点提示。
答案1
这只是一个小错误。我需要将 \sumoccurences 从 \xdef 中移除,然后使用那里的宏。
\newcommand{\sumoccurence}[3]{
% #1=table
% #2=column
% #3=value
\def\colsum{0}
\pgfplotstableforeachcolumnelement{#2}\of#1\as\cell{
\ifdim\cell pt=#3 pt
\pgfmathsetmacro\colsum{\colsum+1}
\fi
}
%\colsum %removed this
}
\newcommand{\addstatisticcol}[5]{ %
% #1=table name to count
% #2=column name to count
% #3=table to add column
% #4=column mith marks
% #5=name of new column
% Sums for each column
%Should read from table #1 the column #2 and count for each mark in table #3 in column #4 and add a new column #5
\pgfplotstablecreatecol[
create col/assign/.code={%
\def\entry{}
\sumoccurence{#1}{#2}{\thisrow{#4}} %call it separately
\xdef\entry{\colsum} %use the created macro here
\pgfkeyslet{/pgfplots/table/create col/next content}\entry
}
]{#5}#3
}
%