I'm not entirely sure I understand, but (can't let that stop me, I'd never get anything done) see inline below.
On Tue, Aug 16, 2011 at 6:57 PM, drflxms <drfl...@googlemail.com> wrote: > 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! I think a simple mtx[obsLevels, refLevels] should do it. Or more simply mtx[order(nchar(gsub("[^1]", "", rownames(mtx))), as.numeric(rownames(mtx))), order(nchar(gsub("[^1]", "", colnames(mtx))), as.numeric(colnames(mtx)))] Best, Ista > 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. > -- Ista Zahn Graduate student University of Rochester Department of Clinical and Social Psychology http://yourpsyche.org ______________________________________________ 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.