Преобразуйте несколько категориальных переменных в бинарные переменные ответа

r plyr reshape reshape2

6720 просмотра

5 ответа

Я пытаюсь преобразовать следующий формат:

mydata <- data.frame(movie = c("Titanic", "Departed"), 
                     actor1 = c("Leo", "Jack"), 
                     actor2 = c("Kate", "Leo"))

     movie actor1 actor2
1  Titanic    Leo   Kate
2 Departed   Jack    Leo

в двоичные переменные ответа:

     movie Leo Kate Jack
1  Titanic   1    1    0
2 Departed   1    0    1

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

Буду очень признателен, если есть чистый способ сделать это.

Автор: ignorant Источник Размещён: 13.11.2019 11:33

Ответы (5)


1 плюс

Решение

Обновленная tidyrопция на основе заключается в преобразовании в длинную форму, использовании completeдля заполнения отсутствующих комбинаций фильмов и актеров, а затем просто преобразовании логического is.naтеста в числовое значение. Затем изменить форму обратно в ширину.

library(tidyr)

mydata %>%
  pivot_longer(starts_with("actor"), names_to = "acted") %>%
  complete(movie, value) %>%
  dplyr::mutate(acted = as.numeric(!is.na(acted))) %>%
  pivot_wider(names_from = value, values_from = acted)
#> # A tibble: 2 x 4
#>   movie     Jack   Leo  Kate
#>   <fct>    <dbl> <dbl> <dbl>
#> 1 Departed     1     1     0
#> 2 Titanic      0     1     1
Автор: camille Размещён: 09.11.2019 07:52

15 плюса

Сколько специй слишком много? Вот решение через tidyr:

library(dplyr)
library(tidyr)

mydata %>%
  gather(actor,name,starts_with("actor")) %>%
  mutate(present = 1) %>%
  select(-actor) %>%
  spread(name,present,fill = 0)

       movie Jack Kate Leo
 1 Departed    1    0   1
 2  Titanic    0    1   1
Автор: AndrewMacDonald Размещён: 23.06.2014 07:52

7 плюса

Один из способов изменить data.frameэто с помощью reshape2пакета, используя meltи dcast. Например:

library(reshape2)
long.mydata <- melt(mydata, id.vars = "movie")
wide.mydata <- dcast(long.mydata, movie ~ value, function(x) 1, fill = 0)

Обратите внимание на fun.aggregateи fillпараметры dcast, которые контролируют то , что происходит , чтобы заполнить интерьер после литья.

Автор: Frank Размещён: 27.08.2013 11:01

4 плюса

Поскольку они говорят, что разнообразие - это специя жизни, вот подход к базе R с использованием table:

table(cbind(mydata[1], 
            actor = unlist(mydata[-1], use.names=FALSE)))
#           actor
# movie      Jack Leo Kate
#   Departed    1   1    0
#   Titanic     0   1    1

Приведенный выше вывод matrixкласса table. Чтобы получить data.frame, используйте as.data.frame.matrix.

as.data.frame.matrix(table(
  cbind(mydata[1], actor = unlist(mydata[-1], use.names=FALSE))))
#          Jack Leo Kate
# Departed    1   1    0
# Titanic     0   1    1
Автор: A5C1D2H2I1M1N2O1R2T1 Размещён: 03.09.2013 04:18

1 плюс

Пакет reshape2также имеет recastфункцию.

Код:

library(reshape2)
recast(mydata, id.var = 'movie', movie ~ value, fun.aggregate = length)

Результат:

     movie Jack Kate Leo
1 Departed    1    0   1
2  Titanic    0    1   1
Автор: h3rm4n Размещён: 26.11.2017 09:01
Вопросы из категории :
32x32