Dear colleagues, I have really heavy problems in sorting the results of a table according to certain features of the levels in the table.
Prerequisites: It all starts with a fairly simple data set, which stores observations of 21 observers (horizontally from 1 to 21; 21 is reference/goldstandard) who diagnosed 42 videos (vertically from 1 to 42). See dump of R-object "input" below in case you are interested in the original data. Each observation is a series of 1 and 0 (different length!) which was obtained by concatenating answers of a multiple choice questionaire. I created a confusion matrix (table) displaying the observations of the 20 observers (nr. 1 to 20) versus the reference (nr. 21) via the following code: ## observations of the reference obsValues<-factor(unlist(input[,-c(1,ncol(input))])) ## observations of the observers refValues<-factor(input[,ncol(input)]) ## data.frame that relates observations of observers and reference RefObs<-data.frame(refValues, obsValues) mtx<-table( RefObs$obsValues, RefObs$refValues, dnn=c("observers", "reference"), useNA=c("always") ) And now the problem: I need to sort the levels/classes of the table. Both axes shall be ordered 1st according to how often 1 occurs in the string that codes the observation and 2nd treating the observation string (formed by 0 and 1) as a number. i.e. "1" "0" "1010" "10000" "100" "11" should be sorted as "0" "1" "100" "10000" "11" "1010" I am aware of the order function and tried a command of the form mtx[order(row1stsort,row2ndsort),order(col1stsort,col2ndsort)]. Sorting i.e. the levels of observers and the reference works well this way: ## sorted levels generated by the reference choices. refLevels <- unique(input[,ncol(input)])[order( as.numeric(sapply(unique(input[,ncol(input)]), FUN=function(x) sum(as.numeric(unlist(strsplit(x,"")))))), as.numeric(as.vector(unique(input[,ncol(input)]))) )] ## sorted levels generated by the observers choices. obsLevels <- unique(unlist(input[,-c(1,ncol(input))]))[order( as.numeric(sapply(unique(unlist(input[,-c(1,ncol(input))])), FUN=function(x) sum(as.numeric(unlist(strsplit(x,"")))))), as.numeric(as.vector(unique(unlist(input[,-c(1,ncol(input))])))) )] Unfortunately this code does not the trick in case of the table mtx (see above). At least I was not successfull with the following code: mtx<-table( RefObs$obsValues, RefObs$refValues, dnn=c("observers", "reference"), useNA=c("always") )[order( as.numeric(sapply(as.vector(unique(RefObs$obsValues)), FUN=function(x) sum(as.numeric(replace(unlist(strsplit(x,"")),which(x=="w"),NA))))), ## generates numeric vector containing sum of digits of classes chosen by observers. 1st order of vertical (row) sorting. Structural missings coded as w are substituted by NA. as.numeric(as.vector(unique(RefObs$obsValues))) ## generates numeric vector containing classes chosen by observers. 2nd order of vertical (row) sorting. Structural missings coded as w are substituted by NA. ), order( as.numeric(sapply(as.vector(unique(RefObs$refValues)), FUN=function(x) sum(as.numeric(replace(unlist(strsplit(x,"")),which(x=="w"),NA))))), ## generates numeric vector containing sum of digits of classes chosen by reference. 1st order of horizontal (column) sorting. Structural missings coded as w are substituted by NA. as.numeric(as.vector(unique(RefObs$refValues))) ## generates numeric vector containing classes chosen by the reference. 2nd order of horizontal (column) sorting. ) ] Any suggestions? I'd appreaciate any kind of help very much! Greetings from Munich, Felix dump of data.frame: options(width=180) # to view it as a whole input <- structure(list(video = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42"), `1` = c("110", "0", "0", "10000", "0", "0", "0", "10000", "0", "0", "11110", "10000", "0", "100", "1110", "10110", "110", "1100", "0", "1000", "11100", "0", "11000", "0", "0", "0", "1110", "0", "0", "10110", "1000", "10010", "10001", "10000", "100", "0", "100", "111", "1000", "0", "0", "0"), `2` = c("0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "100", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"), `3` = c("0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "110", "0", "0", "0", "0", "0", "10", "0", "0", "0", "0", "0", "0", "1000", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1100"), `4` = c("100", "10100", "10100", "10010", "10100", "10000", "0", "10100", "1000", "10000", "10100", "10000", "10100", "10000", "10100", "10000", "10000", "10000", "0", "11000", "11000", "0", "1000", "1000", "0", "0", "0", "0", "10000", "1", "10000", "10000", "10100", "10000", "0", "0", "0", "10010", "0", "0", "0", "100"), `5` = c("10000", "10100", "10100", "0", "0", "0", "0", "0", "0", "0", "100", "0", "0", "0", "0", "0", "111", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "11000", "0", "0", "0", "110", "0", "0", "0", "0", "1", "0", "0", "0", "0"), `6` = c("0", "10100", "10000", "10000", "0", "0", "0", "10000", "0", "10000", "10000", "0", "0", "10000", "10", "10000", "10", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "10000", "10000", "10000", "0", "0", "0", "10000", "0", "0", "0", "0"), `7` = c("0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "10", "0", "100", "0", "0", "0", "10", "0", "0", "0", "100"), `8` = c("0", "0", "100", "0", "0", "0", "0", "0", "0", "0", "100", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "1000", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"), `9` = c("0", "110", "1", "0", "0", "0", "0", "0", "0", "0", "100", "0", "0", "10000", "10000", "10000", "1", "100", "0", "100", "0", "0", "1000", "1000", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1000", "0", "11000", "1", "11000", "0", "1000", "0"), `10` = c("0", "0", "10000", "0", "0", "0", "0", "10000", "0", "0", "100", "10000", "10000", "10000", "10000", "10000", "0", "0", "0", "0", "100", "0", "10000", "0", "0", "0", "0", "0", "0", "0", "0", "0", "10000", "0", "0", "0", "0", "1", "0", "0", "0", "0"), `11` = c("0", "0", "10100", "0", "0", "0", "100", "0", "0", "0", "100", "0", "0", "0", "0", "0", "0", "0", "0", "0", "11100", "0", "1000", "0", "0", "0", "0", "0", "0", "10010", "0", "0", "10100", "0", "0", "0", "0", "10000", "0", "0", "0", "100"), `12` = c("0", "0", "0", "10", "0", "0", "0", "1000", "0", "0", "1100", "0", "0", "0", "0", "0", "110", "100", "0", "0", "0", "0", "1000", "1000", "0", "0", "0", "0", "0", "10100", "10", "10", "11110", "110", "0", "0", "0", "11110", "0", "0", "0", "0"), `13` = c("0", "0", "100", "0", "0", "0", "0", "10100", "1000", "0", "1100", "0", "0", "1", "110", "10", "110", "1", "0", "1000", "0", "0", "1100", "0", "0", "0", "0", "0", "0", "10110", "0", "0", "1", "10000", "0", "0", "0", "1", "0", "0", "1100", "10100"), `14` = c("0", "0", "110", "100", "100", "10000", "100", "100", "1000", "11100", "1100", "10000", "0", "111", "111", "11", "1", "10000", "0", "10000", "10000", "11000", "11000", "1000", "0", "0", "0", "1000", "1000", "111", "0", "0", "10", "100", "0", "0", "1000", "1", "0", "0", "0", "1000"), `15` = c("0", "100", "100", "10", "100", "0", "0", "1000", "0", "10000", "100", "0", "0", "100", "0", "0", "10", "0", "0", "0", "10000", "0", "0", "1000", "0", "0", "0", "0", "0", "0", "0", "0", "10000", "0", "0", "0", "0", "1000", "0", "0", "0", "10000"), `16` = c("0", "0", "100", "0", "0", "0", "10100", "11100", "0", "0", "0", "0", "0", "10111", "1", "0", "0", "0", "0", "1100", "10000", "0", "0", "1000", "0", "0", "0", "1000", "0", "0", "0", "0", "1", "0", "0", "0", "0", "1101", "0", "0", "0", "0"), `17` = c("0", "100", "100", "110", "100", "10000", "100", "10000", "0", "100", "100", "0", "0", "10", "1", "10", "0", "100", "0", "10100", "10000", "1000", "11000", "1000", "1000", "0", "0", "0", "0", "110", "0", "0", "10110", "0", "0", "0", "0", "1", "0", "0", "0", "10100"), `18` = c("0", "110", "101", "110", "0", "1000", "100", "0", "0", "0", "1101", "0", "0", "0", "110", "0", "10", "1000", "0", "0", "0", "0", "1000", "1000", "0", "0", "0", "0", "0", "10100", "0", "10010", "100", "110", "0", "0", "0", "111", "0", "0", "11100", "100"), `19` = c("0", "110", "10111", "0", "0", "0", "10010", "0", "0", "0", "1", "0", "0", "0", "100", "0", "0", "100", "0", "11100", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "1000", "100"), `20` = c("0", "0", "100", "10010", "0", "0", "100", "0", "0", "0", "111", "0", "0", "0", "1100", "0", "111", "0", "0", "0", "1100", "0", "1100", "1000", "0", "0", "0", "0", "0", "111", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "10000"), `21` = c("111", "0", "100", "110", "0", "11000", "10100", "0", "11000", "11000", "1100", "11000", "0", "0", "1110", "0", "1", "1100", "1000", "1000", "11100", "1000", "11100", "1000", "0", "0", "0", "0", "0", "110", "0", "10", "0", "0", "100", "0", "0", "1110", "0", "0", "11000", "1100")), .Names = c("video", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21"), row.names = c(NA, 42L), idvars = "video", rdimnames = list( structure(list(video = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42)), .Names = "video", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42"), class = "data.frame"), structure(list(befunder = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21)), .Names = "befunder", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21"), class = "data.frame")), class = c("cast_df", "data.frame")) ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.