Измените форму фрейма данных, чтобы преобразовать факторы в столбцы в 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()
не принесло желаемого результата.Помощь будет очень признательна.
Решение
Я бы попытался связать еще один столбец с именем «значение» и установить 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
Другие советы
Вот еще один подход с использованием 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)