R:在模式匹配上从2个向量进行逻辑

时间:2017-07-10 13:26:03

标签: r grep pattern-matching

尝试清理一些脏数据(用于工作),我的数据框中有一列用于客户信息(例如我们的例子就是说商店和产品)在一个很奇怪的字符串中,以及一个用于存储和列的列对于产品。我可以从字符串中解析商店和产品。这是我遇到问题的地方。

让我们说(认为这些向量是较大数据帧的一部分,附加数据$如果有帮助,我只是将它们作为向量,认为它可以加速代码而不必拉动整个数据帧) :

WeirdString <- c("fname: john; lname:smith; store:Amazon Inc.; product:Echo", "fname: cindy; lname:smith; store:BestBuy; product:Ps-4","fname: jon; lname:smith; store:WALMART; product:Pants")

所以我解析这个:

WS_Store <- c("Amazon Inc.", "BestBuy", "WALMART")
WS_Prod <- c("Echo", "Ps-4", "Pants")

表中的内容(即未解析的列)是:

DB_Store <- c("Amazon", "BEST BUY", "Other")
DB_Prod <- c("ECHO", "PS4", "Jeans")

我目前正在使用for循环来遍历i来grep&#34; true&#34;解析后的字符串中的字符串。这需要永远,我知道R被设计为使用矢量化代码,所以我的问题是,如何消除循环并使用像lapply(我尝试过,但失败了,因为我不够精明) lapply),还是其他一些矢量化的东西?

我目前的代码:

for(i in 1:nrow(data)){     # could be i in length(DB_prod) or whatever, all vectors are the same length)
  Diff_Store[i] <- !grepl(DB_Store[i], WS_Store[i], ignore.case=T)
  Diff_Prod[i]  <- !grepl(DB_Prod[i] , WS_Prod[i] , ignore.case=T)
}

我打算将这些列追加到数据框中,因为真正的目标是诊断数据库出现此问题的原因。

如果有比这更好的方法,而不是试图对其进行矢量化,我会对此持开放态度。 DB_Store中的数据仅限于特定数量的&#34;存储&#34; (在它来自的表中)但是在字符串中,它似乎是开放的,这就是我使用DB作为模式而不是x的原因。产品类似,但不受限制,这就是为什么有些人有破折号而有些人没有。我很乐意匹配&#34;关闭事物&#34;像Ps-4和PS4一样,但是一旦我看到字符串有多奇怪,我可能只会构建一个匹配表。但事实上,字符串可能不匹配,由裤子/牛仔裤表示。数据集有250万条记录,还有许多不同的商店&#34;和&#34;产品&#34;,我确实想确保它们在同一条线上匹配,而不是&#34;它是否在数据库中#34; (这是以前的问题似乎问的问题,我可以看到字符串是否在字符串列表中,而不是1:1比较,最后一个问题确实以循环结束,这需要几分钟和几小时才能运行)< / p>

谢谢!

1 个答案:

答案 0 :(得分:1)

请检查这是否适合您:

check <- function(vec_a, vec_b){
   mat <- cbind(vec_a, vec_b)
   diff <- apply(mat, 1, function(x) !grepl(pattern = x[1], x = x[2], ignore.case = TRUE))
diff
}

分别在参数vec_avec_b中使用不同的向量来存储商品(或产品)(例如:diff_stores <- check(DB_Store, WS_Store))。此函数将返回一个逻辑向量,其中TRUE值表示在两个原始向量中不匹配的项目。这是你想要的吗?