Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Я попытался бы связать другой столбец с именем "значение" и установить 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

Ответ 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)