我的数据集如下:
id vala valb
1 24 75
2 56 87
在这个数据集中,有两种值类型:vala
和valb
。类型的数量可能会发生变化,可以是三种、四种等等。
我需要将第一个数据集转换为:
id val type
1 24 a
1 75 b
2 56 a
2 87 b
然后排版。或者不进行转换,直接按照第二个数据集的格式排版第一个数据集。
type
column 是为了区分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
用作获取整数值并将其分配给宏的便捷方法。