使用 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}

我能夠建立一個命令來計算給定值的所有出現次數 (\sumoccurrences)。但是當我嘗試在像 \addstatisticcol 這樣的新命令中使用此命令時,它不起作用。我收到很多錯誤,例如

未定義的控制序列。 ...Noten}{Note}{\loadedtable}{Noten}{Anzahl}

和喜歡

\pgfutil@in@@ 的參數有一個額外的 }。 ...Noten}{Note}{\loadedtable}{Noten}{Anzahl}

這是當前的輸出:在此輸入影像描述

希望有人能給我提示。

答案1

這只是一個小錯誤。我需要將 \sumoccurrences 從 \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
}
%

相關內容