Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中从数据集中选择多个模式_R - Fatal编程技术网

如何在R中从数据集中选择多个模式

如何在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","

我有一个带有电子邮件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","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>