编辑有关组织表的功能

时间:2017-03-05 03:58:40

标签: r

我的功能看起来像:

organize.table <- function(x,y = NULL, col = NULL, row = NULL, sort = NULL, sort.row = sort,
                       sort.col = sort, total = TRUE, other = TRUE, ...){

  if((!is.factor(x) & !is.character(x)) | (!is.factor(y) & !is.character(y))){
    stop("Either x or y is not a factor", call. = FALSE)
  }
 if(length(x) != length(y)){
    stop("Length of x not equal to y", call. = FALSE)
 }
 if(!(sort.row %in% c('desc', 'asc')) | is.null(sort.row) |
    !(sort.col %in% c('desc', 'asc')) |  is.null(sort.col)){
    stop("sort.row or sort.col not equal to NULL, 'desc', or 'asc'")
 }
 if((!is.null(sort.row) | !is.null(sort.col)) & total == FALSE){
   stop("To use sort.row or sort.col, parameter 'total' must equal TRUE", call. = FALSE)
 }
 if(length(unique(y)) <= col | length(unique(x)) <= row){
   stop("Error: Dimension mismatch between x and col or y and row. col < the unique number of 
     attributes in y or row < the unique number of attributes in x", call. = FALSE)
 }
 tabs <- table(x,y, ...)
 cs   <- ncol(tabs)
 rs   <- nrow(tabs)
 if(total == TRUE){
   tabs           <- cbind(tabs, rowSums(tabs))
   colname.tabs   <- c(colnames(tabs)[1:cs], 'Total')
   colnames(tabs) <- colname.tabs
   tabs           <- rbind(tabs, colSums(tabs))
   rowname.tabs   <- c(rownames(tabs)[1:rs], 'Total')
   rownames(tabs) <- rowname.tabs
 }
if(sort.row == 'desc') {
   tabs <- tabs[order(-tabs$Total), ]
   tabs <- tabs[rowname.tabs,]
 }
if(sort.row == 'asc')  {
   tabs <- tabs[order( tabs$Total), ]
   tabs <- rowname.tabs
 }
if(sort.col == 'desc') {
   tabs <- tabs[ ,order(-tabs['Total', ])]
   tabs <- colname.tabs
 }
 if(sort.col == 'asc') {
   tabs <- tabs[ ,order( tabs['Total', ])]
   tabs <- colname.tabs
 }
 if(other == TRUE){
   ra   <- row + 1; ca <- col + 1
    tabs <- cbind(tabs[ ,1:col], rowSums(tabs[ ,ca:cs]), tabs$Total)
    tabs <- rbind(tabs[1:row, ], colSums(tabs[ra:rs, ]), tabs['Total',])
    rownames(tabs) <- c(rownames(tabs)[1:row], 'Other', 'Total')
    colnames(tabs) <- c(colnames(tabs)[1:col], 'Other', 'Total')
  }
}

通常在工作时我需要生成一个双向表,该表需要此表中的顶部 ncol nrow 值,并将表的其余部分汇总为<列和行的强>其他。另外,我通常需要总计列和行。有时我需要最少(最少) ncol nrow 值。这实际上是一个灵活的表函数。我收到错误,即:

  

标签错误$ Total:$运算符对原子向量无效

有关修复此问题的任何建议或代码?

1 个答案:

答案 0 :(得分:2)

在两个if陈述中

if(sort.col == 'desc') {
   tabs <- tabs[ ,order(-tabs['Total', ])]
   tabs <- colname.tabs
}
if(sort.col == 'asc') {
   tabs <- tabs[ ,order( tabs['Total', ])]
   tabs <- colname.tabs
}

你设置了tabs <- colname.tabs。一旦你这样做,标签只是一个矢量,
当您尝试使用tabs$Total时,在后续行中不是data.frame, 你得到这个错误。我认为而不是tabs <- colname.tabs 你真的想要colnames(tabs) <- colname.tabs

我发现您还有一个if语句包含 tabs <- rowname.tabs。那应该是 rownames(tabs) <- rowname.tabs

重现错误

您的功能太复杂,我无法重现您的错误 函数,但我可以在一个简单的例子中得到相同的错误信息。

colname.tabs   <- c(colnames(iris)[1:4], 'Total')
colname.tabs 
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Total"

colname.tabs$Total
Error in colname.tabs$Total : $ operator is invalid for atomic vectors