2017-02-20 47 views
0

我有一個表,如下所示:轉換逗號分隔的列表,以虛擬變量

yel <- data.table(id=c(1,2,3)) 
yel$names[1] <- "\"parking space\", \"dining\", \"3bh\"" 
yel$names[2] <- "\"parking\" , \"outdoor\"" 
yel$names[3] <- "\"Hello!\",\"dining room\",\"3bh\"" 
yel 

    id       names 
1: 1 "parking space", "dining", "3bh" 
2: 2   "parking" , "outdoor" 
3: 3  "Hello!","dining room","3bh" 

我是dummify的變量,並加入像停車場的停車空間,也飯廳用餐同樣的話。

我想要虛擬變量如下:parking,dining,3bh,outdoor,hello。有沒有這樣的方法?

+0

最低明確定義的位似乎是*「加盟像停車車位同樣的話,也飯廳用餐」 * - 用'parkingspace'和'diningroom'的結果。你能更準確地表達規則嗎?我們可以概括一下,如果有兩個單詞短語,任何與第一個單詞匹配的條目也應該得到第二個單詞,那麼該空間應該被刪除?有沒有第二個詞不同的情況?如果同時存在「停車位」和「停車場」,會發生什麼? – Gregor

+0

@格雷戈很抱歉不清楚。我想換句話說「像停車位」和「停車場」等類似的詞彙加入「停車場」,這會有幫助嗎? –

+2

如果數據很簡單,那麼你可以在第一個字後面去掉所有的東西。類似於庫(splitstackshape); dcast(cSplit(yel,「names」,「,」,「long」)[,names:= gsub('\\「|。*',」,names)],id 〜names,fun.aggregate = length)'? – A5C1D2H2I1M1N2O1R2T1

回答

0

這個怎麼樣(正則表達式可能還需要稍微調整 - 看起來不夠普遍)。使用tidyr

separate_rows(yel,names,sep=",")->df1 
df1 %>% mutate(newnames=gsub('\\"| space|\\!| |room', "", names)) 

    id   names newnames 
1 1 "parking space" parking 
2 1  "dining" dining 
3 1   "3bh"  3bh 
4 2  "parking" parking 
5 2  "outdoor" outdoor 
6 3  "Hello!" Hello 
7 3 "dining room" dining 
8 3   "3bh"  3bh 
+0

非常感謝 –