我有两个文件。A.csv
:
date,colA
2016-01-01,1
2016-01-02,4
2016-01-03,2
和B.csv
:
date,colB
2016-01-01,2
2016-01-03,4
我想把它们结合起来得到等价的东西:
date,colA,colB
2016-01-01,1,2
2016-01-02,4,0
2016-01-03,2,4
因此,我想将 colB 附加到原始数据中,并且所有缺失的日期B.csv
都应添加值 0。结果数据将使用 pgfplots 绘制。
这可能吗LaTeX、pgfplots 或 pgfplotstable? 我们可以放心地假设它A.csv
具有所有需要的日期。
B.csv
或者是否可以在合并之前先添加缺失的行?
我当前的解决方案是手动添加缺失的行,然后使用\pgfplotstablecreatecol[copy column from table=...
宏。
编辑:我正在使用 Overleaf,因此该解决方案也应该在那里有效。
答案1
好吧,如果你有 R 并且你承认knitr
它是 LaTeX 解决方案,那么很简单:
\documentclass{article}
\usepackage{verbatim,xcolor}
\begin{filecontents*}{A.csv}
date,colA
2016-01-01,1
2016-01-02,4
2016-01-03,2
\end{filecontents*}
\begin{filecontents*}{B.csv}
date,colB
2016-01-01,2
2016-01-03,4
\end{filecontents*}
\begin{document}
<<echo=F,results='asis'>>=
A <- read.csv(file="A.csv")
B <- read.csv(file="B.csv")
C <- merge(A,B,by="date", all=T)
C[is.na(C)] <- 0
write.csv(C, file="C.csv",quote=F,row.names=F)
@
Contents of \fcolorbox{gray}{gray!20}{\texttt{C.csv}}:~~~~~
\parbox{6cm}{\verbatiminput{C.csv}}
\end{document}
答案2
这个解决方案怎么样,不需要 R?仅使用 LaTeX 和datatool
包
\documentclass{article}
\usepackage{filecontents}
\usepackage{datatool}
\begin{filecontents*}{A.csv}
date,colA
2016-01-01,1
2016-01-02,4
2016-01-03,2
\end{filecontents*}
\begin{filecontents*}{B.csv}
date,colB
2016-01-01,2
2016-01-03,4
\end{filecontents*}
% \DTLloaddb{A}{A.csv}
\DTLloaddb{B}{B.csv}
\DTLloaddb{C}{A.csv}
\DTLforeach{C}{\Date=date}{
\DTLgetvalueforkey{\tmp}{colB}{B}{date}{\Date}
\DTLappendtorow{colB}{\DTLifnull{\tmp}{0}{\tmp}}
}
\begin{document}
\DTLsetseparator{,}
\DTLsetdelimiter{"}
\DTLsavedb{C}{C.csv} % doesn't write if before \begin{document}
\DTLdisplaydb{C}
\end{document}