在 R 语言中的向量列表 - 提取向量的一个元素

3
我有一个包含文本的列表,其中每个元素都是一个文本。而文本则是由单词向量组成的。因此,我有一列向量的列表。 我正在对此进行一些文本挖掘。 现在,我正在尝试提取单词,并且这些单词位于单词“no”的后面。我转换了我的向量,所以现在它们是由两个单词组成的向量。例如: list(c("want friend", "friend funny", "funny nice", "nice glad", "glad become", "become no", "no more", "more guys"), c("no comfort", "comfort written", "written conduct","conduct prevent", "prevent manners", "matters no", "no one", "one want", "want be", "be fired")) 我的目标是拥有一个向量列表,它将如下所示: list(c("more"), c("comfort", "one")) 因此,我能够通过liste[i]来查看结果向量中的文本i。
因此,我有一个公式可以提取“no”后面的单词(在第一个向量中会是“more”)。但是当我的文本中有多个“no”时,它不起作用。
以下是我的代码:
liste_negation <- vector(length = length(data))
for (i in 1:length(data)){
  for (j in 1:length(data[[i]])){
    if (startsWith((data[[i]])[[j]], 'no') == TRUE){
      liste_neg[i] <- c(liste_neg[i], tail(strsplit((data[[i]])[[j]],split=" ")[[1]],1))
    } else{
      liste_neg[i] <- c(liste_neg[i])
    }
    liste_negation[[i]] <- c(liste_neg[[i]])
  }
}

当只有一个“no”时,该向量有效:

data <- list(c("want friend", "friend funny", "funny nice", "nice glad", "glad become", "become no", "no more", "more guys"), c("no comfort", "comfort written", "written conduct","conduct prevent", "prevent manners", "matters no", "no one", "one want", "want be", "be fired"))
data

liste_neg <- c()
liste_negation <- vector(length = length(data))
if (startsWith((data[[1]])[[9]], 'no') == TRUE){
  liste_neg[1] <- c(liste_neg[1], tail(strsplit((data[[1]])[[9]],split=" ")[[1]],1))
}

liste_negation[[1]] <- c(liste_neg[[1]])

但是如果我尝试使用循环来适应这个向量中的每个元素,并且文本中有多个“no”,那么它就无法正常工作。

代码:

liste_neg <- c()
liste_negation <- vector(length = length(data))
for (j in 1:length(data[[2]])){
  if (startsWith((data[[2]])[[j]], 'no') == TRUE){
    liste_neg[2] <- append(liste_neg[2], tail(strsplit((data[[2]])[[j]],split=" ")[[1]],1))
  }
}
liste_neg
liste_negation[[2]] <- c(liste_neg[[2]])
liste_negation

警告信息:

Warning message:
In liste_neg[2] <- append(liste_neg[2], tail(strsplit((data[[2]])[[j]],  :
  number of items to replace is not a multiple of replacement length
> liste_neg
[1] NA        "comfort"
> liste_negation[[2]] <- c(liste_neg[[2]])
> liste_negation
[1] "FALSE"   "comfort"

你可以看到,我只有第二个单词在那里。

我尝试了很多方法,也试图将代码拆分并一步一步地运行和处理它,但是在早上花费了所有时间后,我仍然没有找到解决方案。

有人有想法来帮助我吗?

提前谢谢(对不起我的英语不好,我是法国人^^')

4个回答

3
在基础R中,我们可以使用sapply来循环遍历列表,并使用grep来识别包含"no"的单词。
output <- sapply(word_vec, function(x) sub(".*no", "", grep("\\bno\\b", x, value = TRUE)))

#[[1]]
#[1] ""      " more"

#[[2]]
#[1] " comfort" ""         " one" 

如果您不需要空字符串,可以将它们删除以获取。
sapply(output, function(x) trimws(x[x!= ""]))  
#[[1]]
#[1] "more"

#[[2]]
#[1] "comfort" "one"     

3
lapply(data, function(x) substr(x[startsWith(x, "no")], 4, 1000))


[[1]]
[1] "more"

[[2]]
[1] "comfort" "one"    

2
你可以使用带有捕获组的正则表达式来获取所有符合所需模式的子字符串,然后仅提取捕获的组,如下所示:
# regex for strings that start with "no " and have any text after that
r <- '^no (.*)'
lapply(data, function(x) gsub(r, '\\1', regmatches(x, regexpr(r, x))))

#output
[[1]]
[1] "more"

[[2]]
[1] "comfort" "one"  

regexpr 返回一个匹配对象,regmatches 将从中提取匹配的字符串,gsub 使用 \\1 参数来提取第一个捕获的组。


0

提取 "no" 后面的单词的步骤:

  • 首先,使用 grep(i, pattern = "^no", value = T) 获取以 "no" 开头的文本。

  • gsub(pattern = "no ", replacement = "") 将 "no " 替换为空白。

然后可以提取 "no" 之后的单词。

  • lapply() 可以分割列表并将步骤应用到列表中的元素。

  • %>% 管道运算符可以使代码清晰,并将 grep() 的结果传递给 gsub()

library(magrittr)   
lapply(data,function(i)grep(i,pattern = "^no",value = T) %>% gsub(pattern = "no ",replacement = ""))
#[[1]]
#[1] "more"
#    
#[[2]]
#[1] "comfort" "one" 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接