我的功能看起来像:
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:$运算符对原子向量无效。
有关修复此问题的任何建议或代码?
答案 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