首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R:模式匹配的两个向量的逻辑

R:模式匹配的两个向量的逻辑
EN

Stack Overflow用户
提问于 2017-07-10 13:26:03
回答 1查看 362关注 0票数 0

为了清理一些肮脏的数据(为了工作),我的数据框架在一个长长的奇怪字符串中为客户信息(例如存储和产品)提供了一个列,以及一个存储列和一个用于产品的列。我可以从字符串中解析商店和产品。这就是我遇到问题的地方。

假设(假设这些向量是更大的dataframe的一部分,附带了数据$如果这有帮助的话,我只是作为向量使用它们,认为它可以加快代码的速度,而不必拉出整个数据):

代码语言:javascript
运行
复制
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")

因此,我将其解析为:

代码语言:javascript
运行
复制
WS_Store <- c("Amazon Inc.", "BestBuy", "WALMART")
WS_Prod <- c("Echo", "Ps-4", "Pants")

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

代码语言:javascript
运行
复制
DB_Store <- c("Amazon", "BEST BUY", "Other")
DB_Prod <- c("ECHO", "PS4", "Jeans")

目前,我正在使用for循环来循环我来从解析的字符串中添加"true“字符串。这需要花费很长时间,而且我知道R是为了使用矢量化代码而设计的,所以我的问题是,如何消除循环,使用类似lapply的东西(我试过了,但失败了,因为我对lapply不够了解),或者其他向量化的东西?

我现在的代码是:

代码语言:javascript
运行
复制
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)
}

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

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-10 14:21:25

请检查这是否适用于您:

代码语言:javascript
运行
复制
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值引用两个原始向量中不匹配的项。这就是你想要的吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45013304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档