2015-05-11 39 views
0

为了我的搜索的最佳状态,以前没有问过这个问题。 我有一个名为Product的数据框列。本专栏仅列出一个公司名称和产品型号。使用字符串比较来拆分R中的列

product.df <- data.frame("Product" = c("Company1 123M UG", "Company1 234M-I", "Company2 763-87-U","Company2 777-87", "Company3 Name1 87M", "Company3 Name1 O77M", "Company3 Name1 765-U MP")) 

我想将公司名称和产品型号从这一列拆分为两列。我需要一个可以在行之间找到类似单词的函数,并将它们分类为公司名称和其余字母作为产品型号。据我所知,没有两行有相同的型号。所以在上面的情况。我会得到这样的回答

new.product.df <- data.frame("CompanyName" = c("Company1", "Company1", "Company2","Company2", "Company3 Name1", "Company3 Name1", "Company3 Name1"), "Model" = c("123M UG", "234M-I", "763-87-U", "777-87", "87M", "O77M", "765-U MP")) 

我需要一个可以比较两个字符串,并返回我类似的连续字母和字母不同的功能。

+0

什么*“比较两个字符串并返回类似的连续字母和不相似的字母”*?请举个例子。你想要提取模型名称/数字,并进行比较?哪一个? *“Company3 Name1 87M”*的预期输出是什么?它是*“Name1 87M”*,*“1 87M”*还是*“87M”*? – smci

+0

如何知道'Name1'是公司名称的一部分还是模型名称的开头? – nicola

+0

说*“将公司名称和产品型号从这一列分成两列”*非常不清楚 - 哪一列是产品名称*“Name1”*是否进入?你真的需要举例。 – smci

回答

0

如果你保证第一个字始终是公司名称,然后简单地做,最大2输出的第一个固定的空间分割:

require(stringi) 
stri_split_fixed(product.pd[,1], ' ', n=2) 

或:

apply(product.df, 2, function(...) { stri_split_fixed(..., ' ', n=2) }) 

[1] "Company1" "123M UG" 
[1] "Company1" "234M-I" 
[1] "Company2" "763-87-U" 
[1] "Company2" "777-87" 
[1] "Company3" "Name1 87M" 
[1] "Company3" "Name1 O77M" 
[1] "Company3" "Name1 765-U MP" 
+0

对于downvoter,这是一个正确的答案。请解释你的不同意见是什么? – smci

+5

这不是他想要的输出(顺便说一句,我没有downvote)。 'Name1'部分应该留在第一列。 – nicola

+0

@nicola:如果您确信自己明白*“清楚地将公司名称和产品型号从这一列分为两列”*,那么请告诉我们它的含义?产品名称*“Name1”*进入哪一列? OP真的需要举例。 – smci

0

尝试这

new.product.df <- data.frame(company= 
    unlist(lapply(strsplit(as.character(product.df$Product), split=" .[0-9]"), function(x) x[1])), 
    name = 
    unlist(lapply(strsplit(as.character(product.df$Product), split="[1|2] "), function(x) x[2])) 
) 
0

根据您的数据的公司和产品之间的分隔符是第一space字符,所以我们需要将第一步space字符转换为其他字符,在本例中为__,稍后我会告诉您为什么我们需要这样做。

这是你的实际数据

   Product 
1  Company1 123M UG 
2   Company1 234M-I 
3  Company2 763-87-U 
4   Company2 777-87 
5  Company3 Name1 87M 
6  Company3 Name1 O77M 
7 Company3 Name1 765-U MP 

这个代码做这种转换

product.df$Product <- sub(product.df$Product , pattern = " " , replacement = "__" , 
perl = T) 

的数据应该是这样的

   Product 
1  Company1__123M UG 
2   Company1__234M-I 
3  Company2__763-87-U 
4   Company2__777-87 
5  Company3__Name1 87M 
6  Company3__Name1 O77M 
7 Company3__Name1 765-U MP 

然后使用tidyr库分开这个新的数据帧

library("tidyr") 
new.product.df <- separate(product.df , Product , c("Company" , "Model") , sep = "__") 

背后space字符转换为__的原因是,公司的名称也可以包括space性格像公司123M UG & Name1 87M,这将导致错误后因此在这个解决方案的第一步是要避免这种情况以后分开列时。

当然会更好,如果我们对 space字符中第一次出现分离的

,但我不知道如何因为全球改性剂通过默认分隔符正则表达式导通,从而任何建议,欢迎