如何仅使用 pgfplotstable 计算设置字段?

如何仅使用 pgfplotstable 计算设置字段?

我有以下 MWE:

\documentclass{standalone}
\usepackage{tikz, pgfplotstable}
\pgfplotsset{compat=newest,compat/show suggested version=false}

\begin{document}
    \pgfplotstableread{
        x   y
        1   5
        2   10
        3   15
        4   0
        5   0
    }{\dataTable}

    % Transpose table
    \pgfplotstabletranspose[
        colnames from=x,
        input colnames to=x
    ]\dataTransposed{\dataTable}

    % calculate sum
    \pgfplotstablecreatecol[
        create col/assign/.code={
            \def\colsum{0}
            \pgfmathtruncatemacro\maxcolindex{\pgfplotstablecols-1}
            \pgfplotsforeachungrouped \col in {1,...,\maxcolindex}{
                \pgfmathsetmacro\colsum{\colsum+\thisrowno{\col}}
            }
            \pgfkeyslet{/pgfplots/table/create col/next content}\colsum
        }
    ]{sum}\dataTransposed

    % calculate mean
    \pgfplotstablecreatecol[
        create col/expr={
            \thisrow{sum}/(\pgfplotstablecols-2)
        }
    ]{mean}\dataTransposed


    \pgfplotstabletypeset[
        columns/x/.style={string type}
    ]{\dataTransposed}
\end{document}

其结果为:MWE的结果

但是,我只希望平均值使用设置行(= 不为零;大于零的值)。因此,对于给定的数据,仅应使用 x1-3 来计算平均值。目前,它计算全部行,然后除以列数[减二;第一个是 xy 列,第二个是现在存在的和列]。因此,正确的结果应该是 10 [30 / 3],而不是 6 [30 / 5]。

我如何存档、计算设置行数或对表达式应用过滤器,以便获得正确的结果? [仅设置现有值,从而从数据中删除 x4-5,这是可行的,但是,不适用于我的情况。]

我尝试循环遍历数据并找到第一个等于零的列,然后将其保存为计数器并使用该值进行求和除法,但是,我没有成功。也许 pgfplots-table 也有一个过滤功能,尽管我找不到任何表格功能,只有不起作用的图。

答案1

您可以只计算非零条目。

\documentclass{standalone}
\usepackage{tikz, pgfplotstable}
\pgfplotsset{compat=newest,compat/show suggested version=false}

\begin{document}
    \pgfplotstableread{
        x   y
        1   5
        2   10
        3   15
        4   0
        5   0
    }{\dataTable}

    % Transpose table
    \pgfplotstabletranspose[
        colnames from=x,
        input colnames to=x
    ]\dataTransposed{\dataTable}

    % calculate sum
    \pgfplotstablecreatecol[
        create col/assign/.code={
            \def\colsum{0}
            \def\colnum{0}
            \pgfmathtruncatemacro\maxcolindex{\pgfplotstablecols-1}
            \pgfplotsforeachungrouped \col in {1,...,\maxcolindex}{
                \ifnum\thisrowno{\col}=0
                \else
                  \pgfmathsetmacro\colsum{\colsum+\thisrowno{\col}}
                  \pgfmathtruncatemacro\colnum{\colnum+1}
                \fi
            }
            \pgfkeyslet{/pgfplots/table/create col/next content}\colsum
            \xdef\colnum{\colnum}
        }
    ]{sum}\dataTransposed

    % calculate mean
    \pgfplotstablecreatecol[
        create col/expr={
            \thisrow{sum}/(\colnum)
        }
    ]{mean}\dataTransposed


    \pgfplotstabletypeset[
        columns/x/.style={string type}
    ]{\dataTransposed}
\end{document}

在此处输入图片描述

相关内容