Я пытаюсь построить некую статистику по таблице, как в следующем коде:
\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, она не работает. Я получаю много ошибок типа
Неопределенная последовательность управления. ...Примечание}{Примечание}{\loadedtable}{Примечание}{Примечание}
и нравится
Аргумент \pgfutil@in@@ имеет дополнительный символ }. ...Примечание}{Примечание}{\loadedtable}{Примечание}{Примечание}
Надеюсь, кто-нибудь мне подскажет.
решение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
}
%