Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
507 views
in Technique[技术] by (71.8m points)

r - Customize xtable

I'd like to customize xtable for export into LaTeX. I know there are some questions abot xtable here, but I couldn't find the specific things I'm looking for.

Here is an example of how my table might look like:

my.table <- data.frame(Specifiers=c("","Spec1", "Spec2", "Spec3"),
    Values1 = c("N=10", 1.03, 1.71, 2.25),
    Values2 = c("N=20", 1.32, 1.79, 2.43))
colnames(my.table)[1] <- ""

Which creates:

         Values1 Values2
1          N=10    N=20
2 Spec1    1.03    1.32
3 Spec2    1.71    1.79
4 Spec3    2.25    2.43

In fact, this table is imported from a .csv-file as data.frame with my.table <- read.delim("filename.csv", sep=",", header=TRUE)

Now I create a LaTeX table with xtable:

latex.tab <- xtable(my.table, caption=c("Stats"))
print(latex.tab, file="Summarystats.tex",
  floating.environment='sidewaystable',
  include.rownames=FALSE,
  booktabs=TRUE,
  latex.environment=NULL)

Here is the resulting LaTeX code:

egin{sidewaystable}[ht]
egin{tabular}{lllllll}
  oprule
 & Values1 & Values2 \ 
  midrule
               N=10  &  N=20 \
     Spec1  &  1.03  &  1.32 \
     Spec2  &  1.71  &  1.79 \
     Spec3  &  2.25  &  2.43 \

   ottomrule
end{tabular}
end{sidewaystable}

Ok, and now this is what I'd like to change:

1) Insert midrule after the second row instead of after the first. 2) Alternating colours of the rows of this table by inserting owcolors{2}{gray!25}{white} within the sidewaystable (or normal table) environment. 3) Rotating column names by 45° 4) Insert centering instead of the center-environment in cases when I want to center the table.

Any ideas on how to achieve this?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You need some pre-processing, extra argument passed to print.xtable and some post-processing:

my.table <- data.frame(Specifiers=c("","Spec1", "Spec2", "Spec3"),
                       Values1 = c("N=10", 1.03, 1.71, 2.25),
                       Values2 = c("N=20", 1.32, 1.79, 2.43))
colnames(my.table)[1] <- ""

# Pre-processing: rotates column names by 45 degrees
head = apply(as.array(names(my.table)), 1, function(x) paste("\rotatebox{45}{", x, "}"))
head = paste(head, c(rep("&", length(head)-1), "\\
"), collapse="")

latex.tab <- xtable(my.table, caption=c("Stats"))
ltable = print(latex.tab, file="", # File is empty, post-processing needed
      floating.environment='sidewaystable',
      include.rownames=FALSE,
      include.colnames=FALSE, # No colnames
      booktabs=TRUE,
      latex.environment="center", # Or NULL
      # Adds some extra-text after the rows specified in pos.
      # Adds new midrule and comments old one.
      # Adds pre-processed names of columns
      add.to.row=list(pos=as.list(c(0, 0, 1)), command=as.vector(c(head, "%", "\midrule
"))))

# Post-processing: replaces egin{center} with centering
ltable = sub("\begin{center}
", "\centering
", ltable, fixed=TRUE)
ltable = sub("\end{center}
", "
", ltable, fixed=TRUE)

# Post-processing: adds alternating colours
ltable = sub("\begin{tabular}",
             "\rowcolors{2}{gray!25}{white}
\begin{tabular}",
            ltable, fixed=TRUE)

# Writes output to the file
cat(ltable, file="Summarystats.tex")

If you need other tabs environment than tabular you can 1) add new variable:

TABULAR = "tabular"

2) Pass it's value to print.xtable like this:

...
tabular.environment=TABULAR,
...

3) Change your post-processing for alternating colors:

ltable = sub(sprintf("\begin{%s}", TABULAR),
             sprintf("\rowcolors{2}{gray!25}{white}
\begin{%s}", TABULAR),
             ltable, fixed=TRUE)

Result:

enter image description here


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...