Перестановка множества категориальных переменных в двоичные переменные ответа
Я пытаюсь преобразовать следующий формат:
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
Я попробовал решение, описанное в
Преобразование данных строки в двоичные столбцы
но я мог бы заставить его работать для двух переменных, а не из трех.
Я был бы очень признателен, если бы был чистый способ сделать это.
Ответы
Ответ 1
Сколько специй слишком много? Вот решение через 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
Ответ 2
Один из способов изменить ваш 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
, которые управляют тем, что происходит, чтобы заполнить интерьер после кастинга.
Ответ 3
Поскольку они говорят, что разнообразие - это пряность жизни, здесь подход в базе 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
Ответ 4
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