2017-02-20 61 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

非常感谢 –