如何检查短语列表中的任何单词是否包含在R中的列表中?
我有一个数据框,其中有一列名为listA,还有一列名为listB。我只想提取数据框中与listB中的条目匹配的行,因此我有:如何检查短语列表中的任何单词是否包含在R中的列表中?,r,string,match,vectorization,string-matching,R,String,Match,Vectorization,String Matching,我有一个数据框,其中有一列名为listA,还有一列名为listB。我只想提取数据框中与listB中的条目匹配的行,因此我有: newData <- mydata[mydata$listA %in% listB,] 总是返回FALSE,可能是因为它检查strsplit返回的整个列表是否是listB中的一个条目 match(word\u vector,target\u vector)允许两个参数都是向量,这是您想要的(注意:这是向量,不是列表)。事实上,%操作符中的%是match()的同义词
newData <- mydata[mydata$listA %in% listB,]
总是返回FALSE,可能是因为它检查strsplit返回的整个列表是否是listB中的一个条目
match(word\u vector,target\u vector)
允许两个参数都是向量,这是您想要的(注意:这是向量,不是列表)。事实上,%操作符中的%是match()
的同义词,它的帮助告诉您
stringi
package的方法stri\u match.*
可以直接做你想做的事情,它们都是矢量化的,并且比match()
或strsplit()更有效:
stri\u match\u all stri\u match\u regex stri\u match\u first stri\u regex stri\u match\u last stri\u match\u last\u regex
stringi::stri_split_*()
,避免使用base::strsplit()
性能注意事项:尽可能避免像R中的瘟疫那样拆分字符串,它会通过不必要的consccell创建内存泄漏,正如
gc()
所示。这也是stringi
非常有效的另一个原因。您解决这个问题的尝试很不错,但您没有提供一个可复制的示例,也没有提供所需的输出。类似mydata[any(unlist(strsplit(strsplit)(mydata$listA,“/”)]
?谢谢Alex,这让我更接近了。现在的问题是,它对整个listA求值,而不是一次对一行求值。unlist(strsplit(mydata$listA,“//”)返回整个列表中的所有单词,因此any()始终返回TRUE。也许是某种应用函数……是的,我想那是因为未列出。另一种可能是签出grepl
,尽管它没有在模式参数上矢量化。这可能会使它过于复杂,但请尝试unlist(lapply(strsplit(mydata$listA,“/”),function(x)any(x%在%listB中))
作为行子集条件。谢谢!这个软件包非常有用。
strsplit(mydata$listA," ") %in% listB