Изменить форму фрейма данных для преобразования факторов в столбцы в R - PullRequest
15 голосов
/ 08 марта 2010

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

Исходный кадр:

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() не дало желаемого результата. Помощь будет высоко ценится.

Ответы [ 2 ]

15 голосов
/ 08 марта 2010

Я бы попытался связать другой столбец с именем "value" и установить 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(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide")

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

В противном случае вы можете использовать cast из пакета reshape ( см. Этот вопрос для примера ) и установить значение по умолчанию 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
3 голосов
/ 09 марта 2010

Вот еще один подход, использующий 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...