r- Дублированные строки в dummyVars - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть датафрейм в R, здесь есть пример

asdf <- data.frame(id = c(2345, 7323, 2345, 4533),
               place = c("Home", "Home", "Office", "Office"),
               sex = c("Male", "Male", "Male", "Female"),
               consumed = c(1000, 800, 1000, 500))

Как вы можете видеть, дублируется один идентификатор, потому что у него есть два местоположения: Дом и Офис.Я хочу преобразовать каждую символьную переменную в фиктивную переменную и получить только один идентификатор без дублированных идентификаторов.Я уверен, что единственными дублированными значениями могут быть переменные "place".

Когда я применяю dummyVars из каретки, я не могу этого сделать, и для меня это поведение не имеет смысла, например, когдаЯ применяю следующее

dummy <- dummyVars( ~ ., data = asdf, fullRank = FALSE, levelsOnly = TRUE)
predict(dummy, asdf)

Я получаю следующий фрейм данных с дублированными идентификаторами

result <- data.frame(id = c(2345, 7323, 2345, 4533),
                 placeHome = c(1, 1, 0, 0),
                 placeOffice = c(0, 0, 1, 1),
                 sexFemale = c(0, 0, 0, 1),
                 sexMale = c(1, 1, 1, 0),
                 consumed = c(1000,  800, 1000,  500))

, но я хочу это

sexy_result <- data.frame(id = c(2345, 7323, 4533),
                 placeHome = c(1, 1, 0),
                 placeOffice = c(1, 0, 1),
                 sexFemale = c(0, 0, 1),
                 sexMale = c(1, 1, 0),
                 consumed = c(1000,  800, 500))

1 Ответ

0 голосов
/ 07 декабря 2018

Вы можете преобразовать ваш результат фрейм данных, используя пакет dplyr .

library(dplyr)
sexy_result <- result %>% group_by(id) %>% summarise_all(sum)
data.frame(sexy_result)

   id    placeHome  placeOffice sexFemale sexMale consumed
1 2345         1           1         0       2     2000
2 4533         0           1         1       0      500
3 7323         1           0         0       1      800

Если вы хотите суммировать только placeHome и placeOffice , вы можете использовать следующий код

sexy_result <- result %>% group_by(id) %>% summarise(placeHome=sum(placeHome), placeOffice=sum(placeOffice), sexFemale=mean(sexFemale), sexMale=mean(sexMale), consumed=mean(consumed))
data.frame(sexy_result)

   id     placeHome  placeOffice sexFemale sexMale consumed
1 2345         1           1         0       1     1000
2 4533         0           1         1       0      500
3 7323         1           0         0       1      800
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...