2016-03-17 53 views
0

我有一個數據集,我的所有數據都是分類的,我想用一個熱門編碼進行進一步分析。複雜變量的一個熱門編碼

我想主要問題需要解決:

  • 一些細胞中含有很多的文字在一個單元(一個例子如下)。
  • 某些數值需要更改爲進一步處理的因素。

數據與3個標題的時代,信息&目標

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 

我已經檢查過的一些問題是thisthis

+0

你是怎麼得到這個數據在這種形式開始?你能爲我們輸入這幾行嗎? – 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

@手推車和馬海毛爲你的答案,但我有幾個問題..你從哪裏得到變量「rn」。此外,你只分裂變量「信息」,但「年齡」&目標也分裂。這是cSplit庫的一個規範,還是可以選擇哪些變量分割哪些不分割。謝謝 –