2010-03-08 4 views
12

У меня есть кадр данных, где один конкретный столбец имеет набор конкретных значений (скажем, 1, 2, ..., 23). То, что я хотел бы сделать, - это преобразовать из этого макета в тот, где в кадре будут дополнительные 23 (в данном случае) столбцы, каждый из которых представляет одно из значений коэффициента. Данные, приведенные в этих столбцах будет булевы указанием была ли конкретная строка заданного значения коэффициента ... Чтобы показать конкретный пример:Изменить кадр данных для преобразования коэффициентов в столбцы в R

исходного кадра:

ID  DATE   SECTOR 
123  2008-01-01 1 
456  2008-01-01 3 
789  2008-01-02 5 
... <more records with SECTOR values from 1 to 5> 

Желаемая формат:

ID  DATE   SECTOR.1 SECTOR.2 SECTOR.3 SECTOR.4 SECTOR.5 
123  2008-01-01  T   F   F   F   F 
456  2008-01-01  F   F   T   F   F 
789  2008-01-02  F   F   F   F   T 

У меня нет проблем делать это в цикле, но я надеялся, что будет лучший способ. До сих пор reshape() не дал желаемого результата. Помощь будет высоко оценена.

ответ

14

Я бы попытался связать еще один столбец под названием «значение» и установить value = TRUE.

df <- data.frame(cbind(1:10, 2:11, 1:3)) 
colnames(df) <- c("ID","DATE","SECTOR") 
df <- data.frame(df, value=TRUE) 

Затем сделать Reshape:

reshape(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide") 

Проблема с использованием функции reshape является то, что по умолчанию для отсутствующих значений NA (в этом случае вам придется перебирать и заменить их FALSE) ,

В противном случае вы можете использовать cast из reshape пакета (see this question for an example), и установить по умолчанию FALSE.

df.wide <- cast(df, ID + DATE ~ SECTOR, fill=FALSE) 
> df.wide 
    ID DATE  1  2  3 
1 1 2 TRUE FALSE FALSE 
2 2 3 FALSE TRUE FALSE 
3 3 4 FALSE FALSE TRUE 
4 4 5 TRUE FALSE FALSE 
5 5 6 FALSE TRUE FALSE 
6 6 7 FALSE FALSE TRUE 
7 7 8 TRUE FALSE FALSE 
8 8 9 FALSE TRUE FALSE 
9 9 10 FALSE FALSE TRUE 
10 10 11 TRUE FALSE FALSE 
+2

Спасибо. Я должен был подумать о создании столбца значений. Интересно, что метод value column/reshape занимает 1.4 секунды на 9500 строках с 26 уровнями факторов, тогда как использование итеративного подхода (по уровням) занимает всего 0,6 секунды. –

+3

Не обманывайте эти функции: функция 'reshape' сама выполняет итерацию, если вы посмотрите на нее. Но он делает многое кроме того, что добавит к общему времени. Такие вещи, как 'reshape', не предназначены для работы лучше; они там просто облегчают манипуляции с данными. – Shane

2

Вот другой подход, использующий xtabs, который может или не может быть быстрее (если кто-то попытается и дайте мне знать):

df <- data.frame(cbind(1:12, 2:13, 1:3)) 
colnames(df) <- c("ID","DATE","SECTOR") 
foo <- xtabs(~ paste(ID, DATE) + SECTOR, df) 
cbind(t(matrix(as.numeric(unlist(strsplit(rownames(foo), " "))), nrow=2)), foo) 
Смежные вопросы