Измените кадр данных для преобразования факторов в столбцы в R

У меня есть кадр данных, где один конкретный столбец имеет ряд определенных значений (скажем, 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() не привел к желаемому результату. Справка очень ценилась бы.

15
задан Alexander L. Belikoff 8 March 2010 в 19:27
поделиться

2 ответа

Я бы попробовал связать еще один столбец под названием "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
15
ответ дан 1 December 2019 в 04:00
поделиться

Вот еще один подход с использованием 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)
3
ответ дан 1 December 2019 в 04:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: