如何在R中从数据集中选择多个模式
我有一个带有电子邮件ID列表的数据集(数据):如何在R中从数据集中选择多个模式,r,R,我有一个带有电子邮件ID列表的数据集(数据): email=c("susgho.agency@gmail.com","suagencyter.m@gmail.com", "duff.abcnkhgt@gmail.com","ftyhabcdfg@gmail.com", "gjhfhg1-ail.com","gjhgkjhgbrt.gh@aol.com") 我有另一个数据集-(disp),其中包含模式列表: pattern=c(".agency",".abc","
email=c("susgho.agency@gmail.com","suagencyter.m@gmail.com",
"duff.abcnkhgt@gmail.com","ftyhabcdfg@gmail.com",
"gjhfhg1-ail.com","gjhgkjhgbrt.gh@aol.com")
我有另一个数据集-(disp),其中包含模式列表:
pattern=c(".agency",".abc","1-ail.com"))
我想看看这种模式是否与电子邮件相符。
预期产出应如下所示:
email pattern
susgho.agency@gmail.com .agency
suagencyter.m@gmail.com
duff.abcnkhgt@gmail.com .abc
ftyhabcdfg@gmail.com
gjhfhg1-ail.com 1-ail.com
gjhgkjhgbrt.gh@aol.com
我使用for循环,但它需要花费很长时间才能执行
w <- NULL
for(i in 1:nrow(disp))
{
w1 <- as.character(disp[i,1])
w2 <- data[grep(w1, data$email),]
if(nrow(w2) > 0)
{
w2$pattern <- w1
w <- rbind(w, w2)
}
else
w <- rbind(w, w2)
}
w你可以做:
df$pattern[max.col(-attr(adist(df2$pattern,df$email,counts = T),'counts')[,,3])] = as.character(df2$pattern)
df
email pattern
1 susgho.agency@gmail.com .agency
2 suagencyter.m@gmail.com <NA>
3 duff.abcnkhgt@gmail.com .abc
4 ftyhabcdfg@gmail.com <NA>
5 gjhfhg1-ail.com 1-ail.com
使用stringr::str_match
的方法略有不同,不过您需要先通过添加双反斜杠前缀来转义模式中的特殊字符:
email=c("susgho.agency@gmail.com","suagencyter.m@gmail.com",
"duff.abcnkhgt@gmail.com","ftyhabcdfg@gmail.com",
"gjhfhg1-ail.com","gjhgkjhgbrt.gh@aol.com")
pattern=c("\\.agency","\\.abc","1\\-ail.com")
data.frame(email, pattern = stringr::str_match(email, paste(pattern, collapse = "|")))
这将产生以下输出:
email pattern
1 susgho.agency@gmail.com .agency
2 suagencyter.m@gmail.com <NA>
3 duff.abcnkhgt@gmail.com .abc
4 ftyhabcdfg@gmail.com <NA>
5 gjhfhg1-ail.com 1-ail.com
6 gjhgkjhgbrt.gh@aol.com <NA>
电子邮件模式
1苏斯霍。agency@gmail.com机构
2苏亚金泰尔。m@gmail.com
3达夫。abcnkhgt@gmail.com.美国广播公司
4.ftyhabcdfg@gmail.com
5 gjhfhg1-ail.com 1-ail.com
6 gjhgkjhgbrt。gh@aol.com
很抱歉,我很快也意识到了这一点,并删除了评论。@JMilner没问题。:)您能告诉我如何找到解决方案吗?类似于grep(粘贴(pattern,collapse=“|”),email,value=TRUE)
会打印出带有匹配项的电子邮件,但是输出会不同堆栈(setNames(Vectorize(grep)(df2$pattern,df,value=T,fixed=T),df2$pattern))
也可以是堆栈(setNames(mappy(grep,df2$pattern,df,value=T,fixed=T),df2$pattern))
因为Vectorize是mapplyTanks@Onyambu的包装器。但是我得到了一个错误:向量内存耗尽(达到了限制?)@user3642360您可能有大量数据,为什么不尝试使用一些软件包?例如stringr?我想这会起作用。我不太确定。这两种方法中哪一种会给您一个错误?是的,我的数据有500k行。第一种方法会给我错误。第二种方法会永远执行。在这种情况下,我如何使用stringr软件包?
email=c("susgho.agency@gmail.com","suagencyter.m@gmail.com",
"duff.abcnkhgt@gmail.com","ftyhabcdfg@gmail.com",
"gjhfhg1-ail.com","gjhgkjhgbrt.gh@aol.com")
pattern=c("\\.agency","\\.abc","1\\-ail.com")
data.frame(email, pattern = stringr::str_match(email, paste(pattern, collapse = "|")))
email pattern
1 susgho.agency@gmail.com .agency
2 suagencyter.m@gmail.com <NA>
3 duff.abcnkhgt@gmail.com .abc
4 ftyhabcdfg@gmail.com <NA>
5 gjhfhg1-ail.com 1-ail.com
6 gjhgkjhgbrt.gh@aol.com <NA>