簡體   English   中英

閃亮-生成交叉表,其中列總數和行總數作為第一行/列

[英]Shiny - Generate crosstable with column total and row total as the 1st row / column

我想為總行和總列生成一個交叉表。 我試圖使用gmodels包生成交叉表。 輸出的外觀比普通表功能更好。 表格的外觀很重要,因為最后必須使用Shiny進行顯示。 但是問題是我在行和列的末尾得到列總數和行總數。 如何獲得總列為表格中的第一列和第一行。

以下是我的數據示例。

Location <- sample(c("location A","location B","location C","location D","location E"),20,replace = T) 
Brand <- sample(c("Brand A","Brand B","Brand C"),20,replace = T) 
Year <- rep(c("Year 2014","Year 2015"),10)
Q1 <- sample(1:5,20,replace = T)
Q2 <- sample(1:5,20,replace = T)

mydata <- as.data.table(cbind(Location,Brand,Year,Q1,Q2))

數據量巨大,因此它是data.table。

我用於生成交叉表的代碼是-

library("gmodels")

mydata[,CrossTable(Location,Brand,prop.c = T,prop.r = F,prop.t = F,prop.chisq = F,chisq = F,format = "SPSS")]

這給出了輸出,但總列在行末和列末。 另外,總列中缺少列%。 我怎樣才能將總列數作為第一行和第一列,並同時將其作為%?

提出建議。

也許這樣的事情可能會做?

myCT <- function(mydata) {
  mydata_ct_n <- dcast.data.table(mydata, Location ~ Brand, margins = T)
  mydata_ct_n[, all := rowSums(.SD), by = Location]
  mydata_ct_n <- rbind(mydata_ct_n[, lapply(.SD, sum), .SDcols = 2:ncol(mydata_ct_n)], mydata_ct_n, fill = T)
  mydata_ct_n$Location[1] <- "all"
  foocols <- c("all", "Location")
  setcolorder(mydata_ct_n, c(foocols, setdiff(colnames(mydata_ct_n), foocols)))

  mydata_ct_p <- copy(mydata_ct_n)
  for (j in 3:ncol(mydata_ct_p)) {
    set(mydata_ct_p, j = j, value = as.numeric(mydata_ct_p[[j]]))
    set(mydata_ct_p, i = 2:nrow(mydata_ct_p), j = j, value = round(100 * mydata_ct_p[2:nrow(mydata_ct_p), j, with = F] / mydata_ct_p[[j]][1], 0))
  }
  set(mydata_ct_p, 1L, 3L:ncol(mydata_ct_p), round(100 * mydata_ct_p[1L, 3L:ncol(mydata_ct_p), with = F] / mydata_ct_p[["all"]][1], 0))

  for (j in 3:ncol(mydata_ct_p)) {
    set(mydata_ct_p, j = j, value = as.character(mydata_ct_p[[j]]))
    set(mydata_ct_n, j = j, value = as.character(mydata_ct_n[[j]]))
    set(mydata_ct_p, j = j, 
        value = paste0(mydata_ct_p[[j]], "% (", mydata_ct_n[[j]], ")"))
  }
  return(mydata_ct_p)
}

Location <- sample(c("location A","location B","location C","location D","location E"),20,replace = T)
Brand <- sample(c("Brand A","Brand B","Brand C"),20,replace = T)
Year <- rep(c("Year 2014","Year 2015"),10)
Q1 <- sample(1:5,20,replace = T)
Q2 <- sample(1:5,20,replace = T)
mydata <- as.data.table(cbind(Location,Brand,Year,Q1,Q2))

out <- myCT(mydata)
print(out)
#    all   Location Brand A Brand B Brand C
# 1:  20        all 30% (6) 35% (7) 35% (7)
# 2:   3 location A  0% (0) 43% (3)  0% (0)
# 3:   5 location B 33% (2) 14% (1) 29% (2)
# 4:   5 location C 50% (3)  0% (0) 29% (2)
# 5:   4 location D 17% (1) 29% (2) 14% (1)
# 6:   3 location E  0% (0) 14% (1) 29% (2)

您是否嘗試過使用sjPlot包...。它具有一個非常好的功能sjt.xtab,它會生成與您要查找的表類似的交叉表(列聯表)。 它有很多可供探索的選擇。 下面我很少使用它們。 您可以查看?sjt.xtab並查看其他可用選項。 下面的代碼生成具有列百分比的表輸出,並具有列和行的總數。

sjt.xtab(mydata$Location, mydata$Brand,
         show.col.prc = T,
         show.summary = F,
         show.na = F,
         wrap.labels = 50,
         tdcol.col = "#f90470",
         emph.total = T,
         emph.color = "#3aaee5",
         use.viewer = T,
         CSS = list(css.table = "border: 1px solid;",
                    css.tdata = "border: 1px solid;"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM