使用 pgfplotstable 构建统计数据

使用 pgfplotstable 构建统计数据

我正在尝试在表上建立某种统计数据,如以下代码所示:

\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
}
%

相关内容