【问题标题】:Use string comparisons to split a column in R使用字符串比较在 R 中拆分列
【发布时间】:2015-05-11 20:19:52
【问题描述】:

根据我的搜索结果,这个问题以前没有被问过。 我有一个名为 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"))

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

【问题讨论】:

  • 什么是"比较两个字符串并返回相似的连续字母和不相似的字母"?请举个例子。您想同时提取型号名称/编号并进行比较吗?哪一个? "Company3 Name1 87M" 的预期输出是什么?是 "Name1 87M""1 87M" 还是 "87M"
  • 如何知道Name1 是公司名称的一部分还是型号名称的开头?
  • “将公司名称和产品型号从这一列分成两列” 很不清楚——产品名称是哪一列“Name1” 进去?您确实需要举例说明。
  • 公司名称可以是任何字母数字和空格的混合,除非产品名称具有某种结构,否则这个问题无法完全解决。

标签: regex r


【解决方案1】:

如果您保证第一个单词始终是公司名称,那么只需在第一个空格上进行固定拆分,最多 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"

【讨论】:

  • 对于反对者来说,这是一个正确的答案。请说明您对此有何不同意见?
  • 这不是他想要的输出(顺便说一句,我没有投反对票)。 Name1 部分应保留在第一列。
  • @nicola : 如果你相信你理解“将公司名称和产品型号从这一列分成两列”,那么请告诉我们这是什么意思?产品名称“Name1”进入哪一栏? OP真的需要举个例子。
  • 真不知道他想怎么分(我也试过问他);另一方面,他在 OP 中提供了他想要的输出。我只是指出您的输出(尽可能合理)与他的new.product.df 不匹配。
【解决方案2】:

试试这个

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

【讨论】:

    【解决方案3】:

    根据您的数据,公司和产品之间的分隔符是第一个 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 UGName1 87M 这将导致稍后出错,因此此解决方案的第一步是避免稍后在分离列时。

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

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多