我有以下 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}
但是,我只希望平均值使用设置行(= 不为零;大于零的值)。因此,对于给定的数据,仅应使用 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}