我尝试根据列和动态计算errorx
pgfplotstable 中新列的值。\pgfplotstableset{create on use...
error1
error2
error1 - error2
如果我没有缺失值,那么这种方法就很好。 的某些值error1
可能缺失(数据包含“NA”而不是数字)。在这种情况下,新列errorx
应该包含error2
。
我怎样才能做到这一点?
我尝试使用\IfDecimal
该xstring
包,但是失败了。
以下是基于手册中的代码的示例pgfplotstable
:
\documentclass{article}
\usepackage{xstring}
\usepackage{pgfplotstable}
\begin{document}
% Alternative: inline table data:
\pgfplotstableread{
level dof error1 error2 info grad(log(dof),log(error2)) quot(error1)
1 4 NA 7.57858283e-01 48 0 0
2 16 6.25000000e-02 5.00000000e-01 25 -3.00000000e-01 4
3 64 1.56250000e-02 2.87174589e-01 41 -3.99999999e-01 4
4 256 3.90625000e-03 1.43587294e-01 8 -5.00000003e-01 4
5 1024 9.76562500e-04 4.41941738e-02 22 -8.49999999e-01 4
6 4096 2.44140625e-04 1.69802322e-02 46 -6.90000001e-01 4
7 16384 6.10351562e-05 8.20091159e-03 40 -5.24999999e-01 4
8 65536 1.52587891e-05 3.90625000e-03 48 -5.35000000e-01 3.99999999e+00
9 262144 3.81469727e-06 1.95312500e-03 33 -5.00000000e-01 4.00000001e+00
10 1048576 9.53674316e-07 9.76562500e-04 2 -5.00000000e-01 4.00000001e+00
}\loadedtable
% fails with
% ERROR: Package PGF Math Error: Unknown function `NA' (in 'NA-7.57858283e-01 ').
\pgfplotstableset{create on use/error12/.style={
create col/expr={\thisrow{error1}-\thisrow{error2}
}
}
}
% fails with
% ERROR: Undefined control sequence.
%
% --- TeX said ---
% \@xs@IfDecimal@@ ...@xs@arg@i {#1}\edef \@xs@call
% {\noexpand \@xs@IfDecimal ...
% l.38 ...etypeset[columns={dof,errorx}]\loadedtable
\pgfplotstableset{create on use/errorx/.style={
create col/expr={\IfDecimal{\thisrow{error1}}{\thisrow{error1}-\thisrow{error2}}{\thisrow{error2}}
}
}
}
\pgfplotstabletypeset[columns={dof,error12}]\loadedtable
\hspace{2cm}
\pgfplotstabletypeset[columns={dof,errorx}]\loadedtable
\end{document}
答案1
您不能create col/expr
在这里使用,因为它会将其参数直接传递给数学解析器。相反,您必须使用\pgfplotstablecreatecol
和create col/assign/.code
键,这允许您为每个单元格执行任意代码。它要求您将键设置/pgfplots/table/create col/next content
为单元格的所需值
要创建像你描述的列,你可以说
\pgfplotstablecreatecol[
create col/assign/.code={%
\pgfkeys{/pgf/fpu=true}
\getthisrow{error1}\entry
\ifnum\pdfstrcmp{\entry}{NA}=0
\pgfmathparse{\thisrow{error2}}
\else
\pgfmathparse{\thisrow{error1}-\thisrow{error2}}
\fi
\pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult
}
]{errorx}\loadedtable
\documentclass{article}
\usepackage{xstring}
\usepackage{pgfplotstable}
\begin{document}
% Alternative: inline table data:
\pgfplotstableread[string replace={NA}{-9999}]{
level dof error1 error2 info grad(log(dof),log(error2)) quot(error1)
1 4 NA 7.57858283e-01 48 0 0
2 16 6.25000000e-02 5.00000000e-01 25 -3.00000000e-01 4
3 64 1.56250000e-02 2.87174589e-01 41 -3.99999999e-01 4
4 256 3.90625000e-03 1.43587294e-01 8 -5.00000003e-01 4
5 1024 9.76562500e-04 4.41941738e-02 22 -8.49999999e-01 4
6 4096 2.44140625e-04 1.69802322e-02 46 -6.90000001e-01 4
7 16384 6.10351562e-05 8.20091159e-03 40 -5.24999999e-01 4
8 65536 1.52587891e-05 3.90625000e-03 48 -5.35000000e-01 3.99999999e+00
9 262144 3.81469727e-06 1.95312500e-03 33 -5.00000000e-01 4.00000001e+00
10 1048576 9.53674316e-07 9.76562500e-04 2 -5.00000000e-01 4.00000001e+00
}\loadedtable
\pgfplotstablecreatecol[
create col/assign/.code={%
\pgfkeys{/pgf/fpu=true}
\getthisrow{error1}\entry
\ifnum\pdfstrcmp{\entry}{NA}=0
\pgfmathparse{\thisrow{error2}}
\else
\pgfmathparse{\thisrow{error1}-\thisrow{error2}}
\fi
\pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult
}
]{errorx}\loadedtable
\pgfplotstabletypeset[columns={dof,errorx}]\loadedtable
\end{document}