pgfplotstable 中的 IfDecimal

pgfplotstable 中的 IfDecimal

我尝试根据列和动态计算errorxpgfplotstable 中新列的值。\pgfplotstableset{create on use...error1error2error1 - error2

如果我没有缺失值,那么这种方法就很好。 的某些值error1可能缺失(数据包含“NA”而不是数字)。在这种情况下,新列errorx应该包含error2

我怎样才能做到这一点?

我尝试使用\IfDecimalxstring包,但是失败了。

以下是基于手册中的代码的示例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在这里使用,因为它会将其参数直接传递给数学解析器。相反,您必须使用\pgfplotstablecreatecolcreate 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}

相关内容