2016-03-17 11 views
0

У меня есть набор данных, где все мои данные категоричны, и я хотел бы использовать одну горячую кодировку для дальнейшего анализа.Одно горячее кодирование сложных переменных

Основные вопросы, которые я хотел бы решить:

  • Некоторые клетки содержат много текста в одной ячейке (пример будет следовать).
  • Некоторые числовые значения необходимо изменить на коэффициент для дальнейшего процесса.

данных с 3 заголовками Возраст, информация & Target

mydf <- structure(list(Age = c(99L, 10L, 40L, 15L), Info =   c("c(\"good\", \"bad\", \"sad\"", 
"c(\"nice\", \"happy\", \"joy\"", "NULL", "c(\"okay\", \"nice\", \"fun\", \"wild\", \"go\"" 
), Target = c("Boy", "Girl", "Boy", "Boy")), .Names = c("Age", 
"Info", "Target"), row.names = c(NA, 4L), class = "data.frame") 

Я хочу создать один горячий кодирования всех этих переменных, приведенных выше, так это будет выглядеть следующим образом:

 Age_99 Age_10 Age_40 Age_15 good bad sad nice happy joy null okay nice fun wild go Boy Girl 
     1  0  0  0  1 1 1 0  0 0 0 0 0 0 0 0 0 0 
     0  1  0  0  0 0 0 1  1 1 0 0 0 0 0 0 0 1 

Некоторые из вопросов, которые я проверил, я проверил: this и this.

+0

Как Вы пришли к таким данным в следующей форме: Можете ли вы 'dput' эти несколько строк для нас? – A5C1D2H2I1M1N2O1R2T1

ответ

0

Вы можете использовать функцию grepl для сканирования каждой строки в соответствии с тем, что вы ищете, и используйте ifelse, чтобы заполнить столбец соответствующим образом. Что-то вроде:

# This will create a new column labeled 'good' with 1 if the string contains and 0 if not 
data$good = ifelse(grepl("good",data$info),1, 0) 
# and do this for each variable of interest 

И в конце концов, вы можете удалить info столбец, если вы хотите. Таким образом, вам не нужно создавать новые таблицы данных.

data$info <- NULL 

Обратите внимание, что вы должны изменить «данные» на любое фактическое имя вашего набора данных. Что касается проблемы с возрастом, не нужно менять его на множители, просто использовать:

data$age99 = ifelse(data$Age == 99, 1,0) # and so forth for the other ages

+0

спасибо, но главная проблема для меня - это горячая кодировка прямо сейчас. –

2

Я предположил бы, что должно работать:

library(splitstackshape) 
library(magrittr) 

suppressWarnings({        ## Just to silence melt 
    mydf %>%          ## The dataset 
    as.data.table(keep.rownames = TRUE) %>%  ## Convert to data.table 
    .[, Info := gsub("c\\(|\"", "", Info)] %>% ## Strip out c(and quotes 
    cSplit("Info", ",") %>%      ## Split the "Info" column 
    melt(id.vars = "rn") %>%      ## Melt everyting except rn 
    dcast(rn ~ value, fun.aggregate = length) ## Go wide 
}) 
# rn 10 15 40 99 Boy Girl NULL bad fun go good happy joy nice okay sad wild NA 
# 1: 1 0 0 0 1 1 0 0 1 0 0 1  0 0 0 0 1 0 2 
# 2: 2 1 0 0 0 0 1 0 0 0 0 0  1 1 1 0 0 0 2 
# 3: 3 0 0 1 0 1 0 1 0 0 0 0  0 0 0 0 0 0 4 
# 4: 4 0 1 0 0 1 0 0 0 1 1 0  0 0 1 1 0 1 0 

Вот образец данных я использовал :

mydf <- structure(list(Age = c(99L, 10L, 40L, 15L), Info = c("c(\"good\", \"bad\", \"sad\"", 
    "c(\"nice\", \"happy\", \"joy\"", "NULL", "c(\"okay\", \"nice\", \"fun\", \"wild\", \"go\"" 
    ), Target = c("Boy", "Girl", "Boy", "Boy")), .Names = c("Age", 
    "Info", "Target"), row.names = c(NA, 4L), class = "data.frame") 
+0

@A Handcart и Mohair для вашего ответа, но у меня есть несколько вопросов. Откуда вы получаете переменную «rn». Кроме того, вы разделяете только переменную «Info», но «Age» & Target также разделяется. является ли это нормой для библиотеки cSplit или вы можете выбрать, какие varaibles разделять, а не разделять. благодаря –