Редактировать: Создав ответ aL3xa ниже, я изменил его синтаксис ниже. Не идеально, но все ближе. Я до сих пор не нашел способ сделать xxtable accept \ multicolumn {} аргументы для столбцов или строк. Также представляется, что Hmisc обрабатывает некоторые из этих типов задач за кулисами, но это похоже на попытку понять, что там происходит. Кто-нибудь имеет опыт работы с латексной функцией в Hmisc?Графы и проценты в xTable, Sweave, R, cross tabulations
ctab <- function(tab, dec = 2, margin = NULL) {
tab <- as.table(tab)
ptab <- paste(round(prop.table(tab, margin = margin) * 100, dec), "%", sep = "")
res <- matrix(NA, nrow = nrow(tab) , ncol = ncol(tab) * 2, byrow = TRUE)
oddc <- 1:ncol(tab) %% 2 == 1
evenc <- 1:ncol(tab) %% 2 == 0
res[,oddc ] <- tab
res[,evenc ] <- ptab
res <- as.table(res)
colnames(res) <- rep(colnames(tab), each = 2)
rownames(res) <- rownames(tab)
return(res)
}
Я хотел бы создать таблицу, отформатированный для вывода LaTeX, который содержит как счетчики и проценты для каждого столбца или переменной. Я не нашел готового решения этой проблемы, но чувствую, что я должен немного воссоздать колесо.
Я разработал решение для прямых таблиц, но я борюсь с принятием чего-то для кросс-табуляции.
Сначала некоторые примерные данные:
#Generate sample data
dow <- sample(1:7, 100, replace=TRUE)
purp <- sample(1:4, 100, replace=TRUE)
dow <- factor(dow, 1:7, c("Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun"))
purp <- factor(purp, 1:4, c("Business", "Commute", "Vacation", "Other"))
А теперь работает прямая вкладка Функция:
customTable <- function(var, capt = NULL){
counts <- table(var)
percs <- 100 * prop.table(counts)
print(
xtable(
cbind(
Count = counts
, Percent = percs
)
, caption = capt
, digits = c(0,0,2)
)
, caption.placement="top"
)
}
#Usage
customTable(dow, capt="Day of Week")
customTable(purp, capt="Trip Pupose")
Кто-нибудь есть какие-либо предложения для принятия этого для кросс-таблиц (т.е. день недели рейсовым назначения)? Вот то, что я в настоящее время написано, что не использует xtable библиотеку и почти работает, но не является динамическим и довольно некрасиво работать:
#Create table and percentages
a <- table(dow, purp)
b <- round(prop.table(a, 1),2)
#Column bind all of the counts & percentages together, this SHOULD become dynamic in future
d <- cbind(cbind(Count = a[,1],Percent = b[,1])
, cbind(Count = a[,2], Percent = b[,2])
, cbind(Count = a[,3], Percent = b[,3])
, cbind(Count = a[,4], Percent = b[,4])
)
#Ugly function that needs help, or scrapped for something else
crossTab <- function(title){
cat("\\begin{table}[ht]\n")
cat("\\begin{center}\n")
cat("\\caption{", title, "}\n", sep="")
cat("\\begin{tabular}{rllllllll}\n")
cat("\\hline\n")
cat("", cat("", paste("&\\multicolumn{2}{c}{",colnames(a), "}"), sep = ""), "\\\\\n", sep="")
c("&", cat("", colnames(d), "\\\\\n", sep=" & "))
cat("\\hline\n")
c("&", write.table(d, sep = " & ", eol="\\\\\n", quote=FALSE, col.names=FALSE))
cat("\\hline\n")
cat("\\end{tabular}\n")
cat("\\end{center}\n")
cat("\\end{table}\n")
}
crossTab(title = "Day of week BY Trip Purpose")
Не трудно кода LaTeX, скоро он станет неуправляемым. То же самое обозначает HTML. Посмотрите на документацию «xtable» и взгляните на мой ответ (вот слова тщеславного человека). – aL3xa