r - Custom sorting of dataframe by column with duplicates -
i wanted ask help, because having difficulties ordering table, because column table ordered has duplicates (coltoorder). tiny part of table. desired order custom, speaking, based on order of first column, except first value (887).
text<-"col1 col2 col3 coltoorder 895 2 1374 887 888 2 14 887 1018 3 1065 895 896 2 307 895 889 2 4 888 891 2 8 888 1055 2 971 1018 926 3 241 896 1021 2 87 1018 897 2 64 896" mytable<-read.table(text=text, header = t) mytable desired order
myindex<-c(887,895,888,1018,896) # equivalent myindex2<-c(887,887,895,895,888,888,1018,1018,896,896) some failed attemps
try1<-mytable[match(myindex, mytable$coltoorder),] try2<-mytable[match(myindex2, mytable$coltoorder),] try3<-mytable[mytable$coltoorder %in% myindex,] try3<-mytable[myindex %in% mytable$coltoorder,] try4<-mytable[myindex2 %in% mytable$coltoorder,] rownames(mytable) <- mytable$coltoorder # error
it seems coltoorder should treated categorically, not numerically. factors have order of levels, we'll convert factor levels ordered according myindex. ordering "baked in" column , can use order on it.
mytable$coltoorder = factor(mytable$coltoorder, levels = myindex) mytable[order(mytable$coltoorder), ] # col1 col2 col3 coltoorder # 8 895 2 1374 887 # 1 888 2 14 887 # 131 1018 3 1065 895 # 9 896 2 307 895 # 2 889 2 4 888 # 4 891 2 8 888 # 168 1055 2 971 1018 # 134 1021 2 87 1018 # 39 926 3 241 896 # 10 897 2 64 896 do careful - column factor not numeric. if want recover numeric values factor, need convert via character: original_values = as.numeric(as.character(mytable$coltoorder)).
Comments
Post a Comment