Поскольку столбец otu1id
равен factor
, вы не можете заказать их напрямую.
Например, соблюдать уровни данных.
factor(as.character(1:10))
# [1] 1 2 3 4 5 6 7 8 9 10
#Levels: 1 10 2 3 4 5 6 7 8 9
Мы можем удалить "_"
в начале строки, преобразовать данные в цифры c и order
df[order(as.numeric(sub("_", "", df$otu1id))), ]
#OR
#df[order(as.numeric(sub("\\D", "", df$otu1id))), ]
# taxonomy_y otu1id taxonomy_x otu2id otu2 otu1
#1 Alistipes _1 Roseburia _29 333 16
#2 Alistipes _1 Turicibacter _63 241 119
#3 Alistipes _1 Parasutterella _37 14 90
#9 Alistipes _2 Clostridium _12 155 16
#4 Alistipes _10 Dorea _98 56 16
#5 Alistipes _10 Clostridium _10 178 16
#6 Alistipes _10 Clostridium _12 155 16
#10 Alistipes _23 ClostridiumS _12 155 16
#7 Alistipes _100 Clostridium _12 155 16
#8 Alistipes _1008 Clostridium _12 155 16
Если вы преобразуете otu1id
к символу вы можете напрямую использовать mixedorder
из gtools
df[gtools::mixedorder(as.character(df$otu1id)), ]
data
df <- structure(list(taxonomy_y = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L), .Label = "Alistipes", class = "factor"), otu1id = structure(c(1L,
1L, 1L, 2L, 2L, 2L, 3L, 4L, 5L, 6L), .Label = c("_1", "_10",
"_100", "_1008", "_2", "_23"), class = "factor"), taxonomy_x = structure(c(5L,
6L, 4L, 3L, 1L, 1L, 1L, 1L, 1L, 2L), .Label = c("Clostridium",
"ClostridiumS", "Dorea", "Parasutterella", "Roseburia", "Turicibacter"
), class = "factor"), otu2id = structure(c(3L, 5L, 4L, 6L, 1L,
2L, 2L, 2L, 2L, 2L), .Label = c("_10", "_12", "_29", "_37", "_63",
"_98"), class = "factor"), otu2 = c(333L, 241L, 14L, 56L, 178L,
155L, 155L, 155L, 155L, 155L), otu1 = c(16L, 119L, 90L, 16L,
16L, 16L, 16L, 16L, 16L, 16L)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10"))