根据R

时间:2017-07-13 18:00:26

标签: r stringr

我需要在文本字符串中搜索关键字,然后在R数据框中指定一个类别。这会产生一个问题,即我有多个类别的关键字。我想轻松提取表示多个类别的行,以便我可以手动评估它们并指定正确的类别。

为此,我尝试添加一个计数列,以显示每个字符串中表示的类别数。

使用下面链接的两个解决方案的组合,我已经设法获得了部分方式,但我仍然没有得到正确的输出

Partial animal string matching in R

Count occurrences of specific words from a dataframe row in R

我在下面创建了一个示例。我希望应用以下规则:

如果字符串有cat或lion wcount得到1 - 只有1组代表(猫)

如果字符串有狗或狼wcount获得1 - 只有1组代表(犬)

如果字符串有(猫或狮子)和(狗或狼)wcount得到2 - 代表两组(猫科动物和犬科动物)

然后我可以轻松地拉出wcount>行1

id <- c(1:5)
text <- c('saw a cat',
      'found a dog',
      'saw a cat by a dog',
      'There was a lion',
      'Huge wolf'
      )
dataset <- data.frame(id,text)

SearchGrp<-list(c("(cat|lion)", "feline"),
            c("(dog|wolf)","canine"))

output_vector<- character (nrow(dataset))

for (i in seq_along(SearchGrp)){

output_vector[grepl(x=dataset$text, pattern = SearchGrp[[i]][1],ignore.case = TRUE)]<-SearchGrp[[i]][2]}  

dataset$type<-output_vector


keyword_temp <- unlist(lapply(SearchGrp, function(x) new<-{x[1]}))
keyword<-paste(keyword_temp[1],"|",keyword_temp[2])

library(stringr)
getCount <- function(data,keyword)
 {
  wcount <- str_count(dataset$text, keyword)
  return(data.frame(data,wcount))
   }

getCount(dataset,keyword)

1 个答案:

答案 0 :(得分:3)

这是一个基本的R方法来获取不同类型的计数。

dataset$wcnt <- rowSums(sapply(c("dog|wolf", "cat|lion"),
                               function(x) grepl(x, dataset$text)))

此处,sapply会遍历每种类型的正则表达式,并将其提供给grepl。这返回一个矩阵,其中列是指示是否找到特定类型(例如,“dog | wolf”)的逻辑向量。 rowSums对行中的逻辑进行求和以获得类型变化计数。

返回

dataset
  id               text wcnt
1  1          saw a cat    1
2  2        found a dog    1
3  3 saw a cat by a dog    2
4  4   There was a lion    1
5  5          Huge wolf    1

如果你想要中间步骤,将逻辑向量作为data.frame中的变量返回,你可能希望在命名向量中设置你的值,然后用cbind结果。

# construct named vector
myTypes <- c("canine"="dog|wolf", "feline"="cat|lion")
# cbind sapply results of logicals to original data.frame
dataset <- cbind(dataset, sapply(myTypes, function(x) grepl(x, dataset$text)))

返回

dataset
  id               text canine feline
1  1          saw a cat  FALSE   TRUE
2  2        found a dog   TRUE  FALSE
3  3 saw a cat by a dog   TRUE   TRUE
4  4   There was a lion  FALSE   TRUE
5  5          Huge wolf   TRUE  FALSE