使用字符串比较拆分R

时间:2015-05-11 20:19:53

标签: regex r

就我的搜索而言,这个问题以前没有被问过。 我有一个名为Product的数据框列。此列仅在一列中包含公司名称和产品型号。

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"))

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

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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]))
  )

答案 2 :(得分:0)

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

这是您的实际数据

__

此代码执行此类转换

             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&amp; 123M UG这将导致错误,因此此解决方案的第一步是在分离列时避免这种情况。

当然,如果我们在第一次出现Name1 87M字符时分开会更好,但我不知道如何因为默认情况下为分隔符正则表达式启用了全局修饰符,所以任何建议都是欢迎