Преобразовать фактор в двоичные макеты, но не все присутствующие факторы - PullRequest
0 голосов
/ 21 января 2019

У меня есть несколько фреймов данных, которые содержат фактор, который я хочу расширить до количества двоичных эквивалентов (одно горячее кодирование). Однако в каждом фрейме данных присутствуют не все возможные факторы, но я знаю, что это за возможные факторы (таких факторов 70). Я хочу добавить все возможные двоичные файлы для каждого фрейма данных.

Из приведенного ниже кода я могу создать макеты в каждом фрейме данных, но не все возможные макеты. Например, set1.df не имеет ни одного человека в категории «E» или «F», в то время как set2.df не имеет никого в категории «D». Необходимы дополнительные столбцы set1.dfE set1.dfF в set1.df, которые все равны 0, и столбец set2.dfD в set2.df, который является всеми нулями. Я не могу rbind set1.df и set2.df перед созданием манекенов, потому что мне нужно выполнить некоторую обработку каждого фрейма данных с использованием двоичных переменных перед rbinding. Просто чтобы повторить, я знаю, какие уровни возможны в моих данных перед этим, например, от «A» до «F».

library(dummies)

person_id <- c(1,2,3,4,5,6,7,8,9,10)
person_cat <- c("A","B","C","A","B","C","D","A","A","A")
set1.df <- data.frame(person_id,person_cat)

person_id <- c(11,12,13,14,15,16,17,18,19,20)
person_cat <- c("A","B","C","A","B","C","E","E","F","A")
set2.df <- data.frame(person_id,person_cat)

dummies1 <- dummy(set1.df[,2])
dummies2 <- dummy(set2.df[,2])

dummies1
dummies2

Ожидаемый результат:

> dummies1
      set1.dfA set1.dfB set1.dfC set1.dfD set1.dfE set1.dfF
 [1,]        1        0        0        0        0        0
 [2,]        0        1        0        0        0        0
 [3,]        0        0        1        0        0        0
 [4,]        1        0        0        0        0        0
 [5,]        0        1        0        0        0        0
 [6,]        0        0        1        0        0        0
 [7,]        0        0        0        1        0        0
 [8,]        1        0        0        0        0        0
 [9,]        1        0        0        0        0        0
[10,]        1        0        0        0        0        0
> dummies2
      set2.dfA set2.dfB set2.dfC set2.df$D set2.dfE set2.dfF
 [1,]        1        0        0        0        0        0
 [2,]        0        1        0        0        0        0
 [3,]        0        0        1        0        0        0
 [4,]        1        0        0        0        0        0
 [5,]        0        1        0        0        0        0
 [6,]        0        0        1        0        0        0
 [7,]        0        0        0        0        1        0
 [8,]        0        0        0        0        1        0
 [9,]        0        0        0        0        0        1
[10,]        1        0        0        0        0        0

Ответы [ 2 ]

0 голосов
/ 22 января 2019
 library(dummies)

person_id <- c(1,2,3,4,5,6,7,8,9,10)
person_cat <- c("A","B","C","A","B","C","D","A","A","A")
person_cat < -factor(person_cat,levels=c("A","B","C","D","E","F"))
set1.df <- data.frame(person_id,person_cat)

person_id <- c(11,12,13,14,15,16,17,18,19,20)
person_cat <- c("A","B","C","A","B","C","E","E","F","A")
person_cat <- factor(person_cat,levels=c("A","B","C","D","E","F"))
set2.df <- data.frame(person_id,person_cat)

dummies1 <- dummy(set1.df[,2],drop=FALSE)
dummies2 <- dummy(set2.df[,2],drop=FALSE)

dummies1
dummies2
0 голосов
/ 21 января 2019

Вот одно из решений:

levels <- c('A', 'B', 'C', 'D', 'E', 'F')

data <- data.frame(matrix(NA, nrow = length(person_id), ncol = length(levels)))
names(data) <- levels 
for (i in 1:nrow(data)) {
  for (j in 1:length(data)){
    data[i, j] <- ifelse(set1.df[i, 2] == names(data)[j], 1, 0)
  }
}

Вам следует создать пустой фрейм данных с тем же количеством строк, что и идентификаторы, и таким же количеством столбцов, что и уровни, которые есть в set1.df. Затем, используя цикл, вы оцениваете person_cat в каждом столбце. Только когда person_cat равен имени столбца (category_level), значение ячейки будет равно 1.

...