Как создать новый фактор на основе текущего фактора?

В RЯ пытаюсь сделать, это создать фактор путем "группировки" значений в другой фактор или символьную строку.

    factor1 <- as.factor(c("A","B","C","D"))

что я хотел бы создать factor2 такой, что A & B являются E а также C & D являются F, Я пытался зацикливаться и не могу заставить это работать, но считаю, что должен быть элегантный R способ сделать это.

2 ответа

 library(car)
 fac2 <- recode( factor1, " c('A', 'B') = 'E';
                            c('C', 'D') = 'F' ")
 fac2

# [1] E E F F
Levels: E F

Обратите внимание на необходимость отслеживать два вида цитат и необходимость использовать ";" между пунктами группировки. Существует также аргумент 'else', который страница справки для ?car::recode опишу. Для исправленного вопроса recode стратегия будет работать, но и это будет успешным:

fac2 <- 0 + factor1 %in%  c('CA', 'OR', 'WA', 'AK')  # numeric result
fac2 <- factor(fac2) # factor result which displays like a character vector

Обратите внимание, что state.abb - это системная константа, хотя это символьный вектор, а не фактор:

 sts <- state.abb[sample(50)]   # a scrambled version
 sts[ sts %in% c('CA', 'OR', 'WA', 'AK')]
#[1] "CA" "AK" "OR" "WA"

Для использования car:: recode этот код выполняется успешно (отмечая, что recode возвращает коэффициент, если задан фактор в качестве входных данных, чего я не сделал):

 recode(sts, " c('CA', 'OR', 'WA', 'AK') = 1; else=0")
#-------
 [1] 0 0 0 0 1 0 0 1 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 0 0 1 0 1
[45] 0 0 0 0 0 0

Это то, что вы ожидаете?

factor2 <- factor1
levels(factor2) <- rep(c("E","F"), each=2)

# [1] E E F F
# Levels: E F

Используя пример @DWin, я бы сделал что-то вроде этого:

set.seed(2)
sts <- state.abb[sample(50)]
# your factor1 would be
factor1 <- factor(sts)
# you would construct factor2 as 
factor2 <- factor(0 + factor1 %in% c('CA', 'OR', 'WA', 'AK'))
Другие вопросы по тегам