r - R中的向量列表-提取向量的一个元素
问题描述
我有一个包含一些文本的列表。所以列表的每个元素都是一个文本。文本是单词的向量。所以我有一个向量列表。我正在对此进行一些文本挖掘。现在,我正在尝试提取单词“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”)。但是当我的文字中有几个“不”时,它就不起作用了。
这是我的代码:
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]])
但是,如果我尝试使用循环对其进行调整以查看向量的每个元素,并且文本中存在多个“否”,则它不起作用。
代码 :
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"
如您所见,我只有第二个单词。
我尝试了很多东西,我尝试拆分代码并运行它并逐个处理它,但是在花了整个上午之后我还没有找到解决方案..
有人有什么想法可以帮助我吗?
提前谢谢你(对不起我的英语,我是法国人^^')
解决方案
在基础 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"
推荐阅读
- c# - 从 Docker 运行的自动扩展 Kafka Consumer
- javascript - 我如何描述这两种价值传递方式之间的区别?
- java - 仅使用 Springboot 和 MongoDB 比较 YYYY-MM 部分日期
- pine-script - Strategy.long 后第二次交叉,Pine 脚本
- c# - 在长时间运行的工作人员服务中创建 HttpClient 对象的建议方法是什么
- bots - 对不和谐机器人的编码感到困惑
- reactjs - 在不渲染父组件 React js 的情况下重新渲染子组件
- javascript - forEach - 在 Redux 中向 action.data 添加键/值 - console.log 有效,但 Redux 状态未更新
- ios - (iOS)无法使用 AVURLAsset 和 AVAsset 阅读器从 RAM 而不是文件读取视频帧
- excel - 使用填充功能