Измените форму фрейма данных, чтобы преобразовать факторы в столбцы в R

StackOverflow https://stackoverflow.com/questions/2404085

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня есть фрейм данных, в котором один конкретный столбец имеет набор определенных значений (скажем, 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top