Как создать новый фактор на основе текущего фактора?
В 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'))