闪亮-生成列总数和行总数作为第一行/列的交叉表
Shiny - Generate crosstable with column total and row total as the 1st row / column
我想生成一个交叉table,其中包含行和列的总列。我尝试使用 gmodels 包生成 crosstable 。输出的外观比正常的 table 函数要好。 table 的外观很重要,因为最终必须使用 Shiny 显示它。但问题是我在行和列的末尾得到列总数和行总数。如何将总列作为 table.
中的第一列和第一行
下面是我的数据样本。
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。
我用于生成交叉 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 可以生成与您正在寻找的类似的交叉表(偶然事件 tables)。它有许多可供探索的选项。我在下面使用了其中的一些。您可以查看 ?sjt.xtab 并查看其他可用选项。下面的代码生成 table 输出,其中包含列百分比并具有总列数和总行数。
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;"))
我想生成一个交叉table,其中包含行和列的总列。我尝试使用 gmodels 包生成 crosstable 。输出的外观比正常的 table 函数要好。 table 的外观很重要,因为最终必须使用 Shiny 显示它。但问题是我在行和列的末尾得到列总数和行总数。如何将总列作为 table.
中的第一列和第一行下面是我的数据样本。
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。
我用于生成交叉 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 可以生成与您正在寻找的类似的交叉表(偶然事件 tables)。它有许多可供探索的选项。我在下面使用了其中的一些。您可以查看 ?sjt.xtab 并查看其他可用选项。下面的代码生成 table 输出,其中包含列百分比并具有总列数和总行数。
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;"))