Вы можете снять числа и вычислить mean
, если есть два вхождения, чтобы получить квази-числовые suffix
es.
suffix <- sapply(strsplit(trimws(gsub("\\D+", " ", levels(Sample))), " "), function(x)
mean(as.numeric(x)))
Затем, чтобы получить prefix
, преобразуйте категории в более высокие числа с правильным порядком, используя cat.df
в качестве матрицы присваивания.
cat.df <- data.frame(c("Beginner", "intermediate", "Expert"),
(1:3)*100)
prefix <- sapply(gsub("(\\D+)\\s.*", "\\1", levels(Sample)), function(x, y)
cat.df[match(x, y), 2], cat.df[, 1])
Это все, чтобы высвободить Sample
вектор.
new.Sample <- factor(Sample, levels=levels(Sample)[order(prefix + suffix)])
# [1] Beginner 1 intermediate 8 intermediate 7 & 8 Expert 2
# [5] Expert 10 Beginner 3 & 4 Beginner 5 Beginner 10
# [9] intermediate 1 Expert 1 <NA>
# 10 Levels: Beginner 1 Beginner 3 & 4 Beginner 5 Beginner 10 ... Expert 10
Чек
data.frame(sort(new.Sample), as.numeric(sort(new.Sample)))
# sort.new.Sample. as.numeric.sort.new.Sample..
# 1 Beginner 1 1
# 2 Beginner 3 & 4 2
# 3 Beginner 5 3
# 4 Beginner 10 4
# 5 intermediate 1 5
# 6 intermediate 7 & 8 6
# 7 intermediate 8 7
# 8 Expert 1 8
# 9 Expert 2 9
# 10 Expert 10 10
Преобразование в цифры c
as.numeric(new.Sample)
# [1] 1 7 6 9 10 2 3 4 5 8 NA
Данные
Sample <- structure(c(1L, 10L, 9L, 7L, 6L, 3L, 4L, 2L, 8L, 5L, NA), .Label = c("Beginner 1",
"Beginner 10", "Beginner 3 & 4", "Beginner 5", "Expert 1", "Expert 10",
"Expert 2", "intermediate 1", "intermediate 7 & 8", "intermediate 8"
), class = "factor")