在 pgfplotstable 中将一行拆分成几行

在 pgfplotstable 中将一行拆分成几行

我的数据集如下:

id vala    valb
1  24      75
2  56      87

在这个数据集中,有两种值类型:valavalb。类型的数量可能会发生变化,可以是三种、四种等等。

我需要将第一个数据集转换为:

id val type
1  24  a 
1  75  b
2  56  a
2  87  b

然后排版。或者不进行转换,直接按照第二个数据集的格式排版第一个数据集。

typecolumn 是为了区分id,不过不是必须的,如果可以的话,最好从列名的最后一个字符开始生成。

以下是 MWE:

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{pgfplotstable}
\pgfplotsset{width=10cm,compat=1.6}
\usepackage{filecontents}


\begin{filecontents}{testdataExisting.dat}
id vala    valb
1  24      75
2  56      87
\end{filecontents}

\begin{filecontents}{testdataGenerated.dat}
id val type
1  24  a 
1  75  b
2  56  a
2  87  b
\end{filecontents}

 \begin{document}
Table 1

 \pgfplotstabletypeset[col sep=space,columns={id,vala,valb},]{testdataExisting.dat}

Table 2

 \pgfplotstabletypeset[col sep=space,columns={id,val,type},
    columns/type/.style={string type,column type=r},
 ]{testdataGenerated.dat}
 \end{document}

输出:

答案1

定义一个新表,其中正确收集了原始表中的元素值,如下所示:

示例输出

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{pgfplotstable}
\pgfplotsset{width=10cm,compat=1.6}
\usepackage{filecontents}


\begin{filecontents}{testdataExisting.dat}
id vala    valb
1  24      75
2  56      87
\end{filecontents}

\pgfplotstableread{testdataExisting.dat}\origtable

\begin{document}
Table 1

\pgfplotstabletypeset[col sep=space,columns={id,vala,valb}]\origtable

Table 2

\pgfplotstablegetrowsof{\origtable}
\pgfmathtruncatemacro\rr{2*\pgfmathresult}
\pgfplotstablenew[%
  create on use/newid/.style={%
  create col/assign/.code={%
  \pgfmathtruncatemacro\orr{\pgfplotstablerow/2}
  \pgfplotstablegetelem{\orr}{id}\of\origtable
  \pgfkeyslet{/pgfplots/table/create col/next content}\pgfplotsretval}},%
  create on use/newval/.style={%
  create col/assign/.code={%
  \pgfmathtruncatemacro\orr{\pgfplotstablerow/2}
  \pgfmathtruncatemacro\occ{\pgfplotstablerow-2*\orr}
  \edef\ocol{\ifnum\occ=0 vala\else valb\fi}
  \pgfplotstablegetelem{\orr}{\ocol}\of\origtable
  \pgfkeyslet{/pgfplots/table/create col/next content}\pgfplotsretval}},%
  create on use/type/.style={%
  create col/assign/.code={%
  \pgfmathtruncatemacro\orr{\pgfplotstablerow/2}
  \pgfmathtruncatemacro\occ{\pgfplotstablerow-2*\orr}
  \edef\otyp{\ifnum\occ=0 a\else b\fi}
  \pgfkeyslet{/pgfplots/table/create col/next content}\otyp}},%
  columns={newid,newval,type}]{\rr}\newtable

  \pgfplotstabletypeset[columns/type/.style={string type,column type=r}]\newtable
\end{document}

对于新表,create on use每一列都有一个。 \pgfmathtruncatemacro用作获取整数值并将其分配给宏的便捷方法。

相关内容