Восстановите категориальную переменную из манекенов в R

Привет, я новичок в R, и у меня есть проблема, которую я пока не нашел. Я хотел бы преобразовать фиктивные переменные обратно в категориальные переменные.

|dummy1| dummy2|dummy3|
|------| ------|------|
| 0    | 1     |0     |
| 1    | 0     |0     |
| 0    | 1     |0     |
| 0    | 0     |1     |

в:

|dummy |
|------|
|dummy2|
|dummy1|
|dummy2|
|dummy3|

У вас есть идеи, как это сделать в R? Заранее спасибо.


person waterline    schedule 06.03.2018    source источник


Ответы (3)


Вы можете сделать это с помощью data.table

id_cols = c("x1", "x2") 
data.table::melt.data.table(data = dt, id.vars = id_cols, 
                            na.rm = TRUE, 
                            measure = patterns("dummy"))

Пример:

t = data.table(dummy_a = c(1, 0, 0), dummy_b = c(0, 1, 0), dummy_c = c(0, 0, 1), id = c(1, 2, 3))
data.table::melt.data.table(data = t, 
                            id.vars = "id", 
                            measure = patterns("dummy_"), 
                            na.rm = T)[value == 1, .(id, variable)]

Выход

   id variable
1:  1  dummy_a
2:  2  dummy_b
3:  3  dummy_c

Еще проще, если вы замените 0 на NA, поэтому na.rm = TRUE в расплаве будет удаляться каждая строка с NA

person Federico Molina Magne    schedule 16.01.2020

Мы можем использовать max.col

data.frame(dummy = names(df1)[max.col(df1)])
#    dummy
#1 dummy2
#2 dummy1
#3 dummy2
#4 dummy3

данные

df1 <- structure(list(dummy1 = c(0L, 1L, 0L, 0L), dummy2 = c(1L, 0L, 
 1L, 0L), dummy3 = c(0L, 0L, 0L, 1L)), .Names = c("dummy1", "dummy2", 
 "dummy3"), class = "data.frame", row.names = c(NA, -4L))
person akrun    schedule 06.03.2018
comment
Спасибо за ответ. Что я делаю в том случае, если у меня есть и другие категориальные переменные в кадре данных. Не только dummy1-3, но и, например. образование 1-4 - person waterline; 06.03.2018
comment
@waterline Затем просто подмножьте набор данных для dummy, т.е. nm1 <- grep('dummy", names(df1), value = TRUE); nm1[max.col(df1[nm1])] - person akrun; 06.03.2018

Вот решение tidyverse с использованием tidyr::gather. Здесь мы рассматриваем key как переменную, категорией которой является каждый манекен, а value как наличие/отсутствие. Замена 0 на NA в сочетании с na.rm = TRUE в gather означает, что мы не сохраняем все остальные строки, которые нам не нужны, и не создаем излишне большой промежуточный набор данных.

df1 <- structure(list(dummy1 = c(0L, 1L, 0L, 0L), dummy2 = c(1L, 0L, 
                                                             1L, 0L), dummy3 = c(0L, 0L, 0L, 1L), ed1 = c(1, 0, 1, 0), ed2 = c(0, 
                                                                                                                               1, 0, 1), id = c(1, 2, 3, 4)), .Names = c("dummy1", "dummy2", 
                                                                                                                                                                         "dummy3", "ed1", "ed2", "id"), row.names = c(NA, -4L), class = "data.frame")
library(tidyverse)
df1 %>%
  mutate_at(vars(dummy1:dummy3, ed1:ed2), ~ ifelse(. == 0, NA, .)) %>%
  gather("dummy", "present", dummy1:dummy3, na.rm = TRUE) %>%
  gather("ed", "present2", ed1:ed2, na.rm = TRUE) %>%
  select(-present, -present2)
#>   id  dummy  ed
#> 2  1 dummy2 ed1
#> 3  3 dummy2 ed1
#> 5  2 dummy1 ed2
#> 8  4 dummy3 ed2

Создано 06 марта 2018 г. с помощью пакета reprex (v0.2.0).

person Calum You    schedule 06.03.2018