Как обозначить фактор, который объединяет два уровня с "&" - PullRequest
1 голос
/ 12 марта 2020

У моих данных есть неожиданный фактор, который объединяет два уровня с &: «промежуточные 7 и 8»

Каков наилучший способ переоценить это значение? В будущем, есть вероятность, что фактор может быть объединен таким же образом, например, «Beginner 3 & 4» и т. , Оно должно быть между "промежуточным 7" и "промежуточным 8".

Есть ли хорошие идеи для его разложения и преобразования в числа c?

1 Ответ

1 голос
/ 12 марта 2020

Вы можете снять числа и вычислить 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...