В R, как я могу добавить несколько столбцов с 0/1 счет на основе другого столбца? - PullRequest
0 голосов
/ 09 февраля 2019

Используя набор данных mtcars в R в качестве примера, я хочу добавить дополнительные столбцы в фрейм данных mtcars для каждого типа автомобиля.С помощью этой строки я могу получить модели автомобилей:

unique(sapply((strsplit(row.names(mtcars), " ")), "[[", 1))

Какие 22 дополнительных столбца я хочу добавить.Новый столбец для каждой модели автомобиля:

length(unique(sapply((strsplit(row.names(mtcars), " ")), "[[", 1)))

Я придумал следующий код:

mtcars01 <- mtcars
car.nms <- sapply((strsplit(row.names(mtcars), " ")), "[[", 1)
mtcars01$Mazda <- (car.nms=="Mazda")*1
mtcars01$Datsun <- (car.nms=="Datsun")*1
mtcars01$Hornet <- (car.nms=="Hornet")*1

И так далее, и так далее ... Пройдя через всемодели автомобилей, пока у меня не добавится новая колонка для каждой модели автомобиля, с нулями и единицами.Это то, что я после.Затем я мог бы просмотреть все уникальные модели автомобилей, но я бы предпочел не добавлять петли.Если возможно.

Мой собственный фрейм входных данных выглядит аналогично набору данных mtcars, но у меня другое количество моделей автомобилей, и я хотел бы повторно использовать этот код для фреймов данных, в которых количество моделей автомобилей варьируется.В моем собственном фрейме данных может быть только 3 модели автомобилей, и мне потребуется 3 дополнительных столбца, добавленных к фрейму данных с нулями и единицами для этих моделей автомобилей.Я пометил этот вопрос как «агрегат» и «dplyr», поскольку они кажутся многообещающими.Но я могу ошибаться в этой части.Спасибо за любую помощь.Извините, если я пропустил ответ.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Другой вариант будет использовать model.matrix:

cbind(mtcars, model.matrix(~ car.nms - 1))
0 голосов
/ 09 февраля 2019

Одним из вариантов может быть циклический просмотр элементов unique элемента car.nms, сравнение (==) со значениями car.nms и приведение логической матрицы к двоичному (+)

mtcars01[unique(car.nms)] <- +(sapply(unique(car.nms), `==`,  car.nms))

Или, используя tidyverse, получить первое слово из имен строк с помощью word (из stringr), pull столбца имени строки, используйте mtabulate (из *)1013 *) и связать столбцы с исходными данными

library(tidyverse)
library(qdapTools)
rownames_to_column(mtcars) %>%
     mutate(rowname = word(rowname)) %>% 
     pull(rowname) %>% 
     mtabulate %>% 
     bind_cols(mtcars, .)
...