2012-05-09 4 views
2

У меня возникают большие проблемы со следующей проблемой, и я не могу найти ответ с обширным поиском. Если у меня есть следующие:R: Обратное взаимодействие факторов

> fac1 <- factor(c("a", "b", "c")) 
> fac2 <- factor(c("d", "e", "f")) 
> fac3 <- interaction(fac1,fac2) 
> fac3 

[1] a.d b.e c.f 
Levels: a.d b.d c.d a.e b.e c.e a.f b.f c.f 

Какую функцию можно запустить разделить FAC3, так что я могу получить уровни исходных факторов ставят во взаимодействие? Таким образом:

> myFun(fac3, 1) 
[1] "a" "b" "c" "a" "b" "c" "a" "b" "c" 
> myFun(fac3, 2) 
[2] "d" "d" "d" "e" "e" "e" "f" "f" "f" 

Спасибо.

ответ

5
> myFun <- function(fac, idx) sapply(strsplit(as.character(fac), "\\."), "[", idx) 
> myFun(fac3,1) 
[1] "a" "b" "c" 
> myFun(fac3,2) 
[1] "d" "e" "f" 

В зависимости от того, что вы хотели сделать с этими векторами, вы можете обернуть коэффициент() вокруг результатов. В вашем вопросе есть какая-то двусмысленность. Глядя на вклад @ user1317221, я вижу, что он возвращает то, что вы сказали, что хотите, но когда вы сказали, что хотите уровни фактора, я думал, что вы хотите векторов только до тех пор, пока «fac3» имеет три элемента, несмотря на более длительные уровни атрибут.

+0

Спасибо, что прекрасно работает. strsplit была основной вещью, на которую я охотился, но «[бит» как функция в sapply тоже нова для меня. –

+0

Да. Учимся думать о «[», поскольку функция инфикса немного отличается, признаюсь. –

+0

Я думаю, что я только что тренировался, чтобы увидеть открытую скобку, не закрывая проблемы, ожидающей ее. Функция, которую вы предоставили, именно то, что я искал. –

2

Вы можете легко превратить следующее в функции

sapply(strsplit(as.character(fac3), "\\."), "[", 1) 
sapply(strsplit(as.character(fac3), "\\."), "[", 2) 
Смежные вопросы