2012-12-16 2 views
12

Я хотел бы преобразовать свой dataframe в матрицу, которая расширяет один факторный столбец на несколько и назначает 1/0 в зависимости от фактора. НапримерПреобразование коэффициентов R в значения двоичных матриц

C1 C2 C3 
A 3 5 
B 3 4 
A 1 1 

должен превратиться в нечто вроде

C1_A C1_B C2 C3 
1  0 3 5 
0  1 3 4 
1  0 1 1 

Как я могу сделать это в R? Я пробовал data.matrix, as.matrix, который не возвращал то, что я хотел. Они присваивают «целочисленное» значение одному столбцу факторов, нет расширения.

ответ

15

Предполагая, что dat ваш кадр данных:

cbind(dat, model.matrix(~ 0 + C1, dat)) 

    C1 C2 C3 C1A C1B 
1 A 3 5 1 0 
2 B 3 4 0 1 
3 A 1 1 1 0 

Это решение работает с любым количеством уровней факторов и без ручного указания имен столбцов.

Если вы хотите, чтобы исключить столбец C1, вы могли бы использовать эту команду:

cbind(dat[-1], model.matrix(~ 0 + C1, dat)) 
+10

Кажется, что OP хочет 'model.matrix (~. + 0, dat)'. – Roland

+0

@Roland Хорошая идея +1. Это было бы еще проще. –

+1

@ Свен, это сработало, спасибо. Он все еще сохраняет C1 в результате (в дополнение к столбцам C1_A, C1_B), любая идея, как удалить исходный столбец? Это более общий вопрос, хотя (возможно), просто простой способ R сказать «дать мне все столбцы, кроме _that_ one». – user423805

2

Давайте назовем ваш data.frame df:

library(reshape2) 
dcast(df,C2*C3~C1,fill=0,length) 

    C2 C3 A B 
1 1 1 1 0 
2 3 4 0 1 
3 3 5 1 0 
+1

Спасибо за оба ответы .. разве есть способ сделать это преобразование без указания имен столбцов, таких как C1? Просто .. convert (df), и он будет обрабатывать факторы. lm(), а также другие методы регрессии делают это внутренне правильно? – user423805

3
dat <- read.table(text =' C1 C2 C3 
A 3 5 
B 3 4 
A 1 1',header=T) 

Используя преобразование

transform(dat,C1_A =ifelse(C1=='A',1,0),C1_B =ifelse(C1=='B',1,0))[,-1] 
    C2 C3 C1_A C1_B 
1 3 5 1 0 
2 3 4 0 1 
3 1 1 1 0 

Или, чтобы получить больше flexbility с within

within(dat,{ 
      C1_A =ifelse(C1=='A',1,0) 
      C1_B =ifelse(C1=='B',1,0)}) 

    C1 C2 C3 C1_B C1_A 
1 A 3 5 0 1 
2 B 3 4 1 0 
3 A 1 1 0 1 
Смежные вопросы