如何在R中使用两个数据帧?

时间:2014-12-26 21:31:09

标签: r apply stop-words

背景

我有一个包含大约1M行文本的数据框。我想替换TM包无法处理的大量自定义停用词。该列表由~37K字组成。我有以下代码,它需要一段时间,但我想用apply函数改进代码。

问题

我不知道如何在适用的应用功能中使用来自两个数据帧的内容。这是我的代码:

stopwords <- read.table("stopwords.csv", header=TRUE, quote="\"", stringsAsFactors=FALSE)
corpus <- read.delim("corpus.txt", header=TRUE, stringsAsFactors=FALSE)

for(i in 1:nrow(stopwords)){
  corpus$text <- gsub(paste("\\<",stopwords$list[i],"\\>", sep=""), "", corpus$text)
  message(paste(i, stopwords$list[i], sep=" - ")) #Show in console
}

我还在控制台中显示当前计数/单词以跟踪进度,但是一旦我有一个应用函数工作,我将把它包装在pbapply包中以获得正确的进度条。

示例数据

语料库数据框 - 带有&#34; text&#34;的单列作为标题
警察世界采取行动果断的首要迈克贝尔德 警方行动地图影响交通区域实时交通nsw
委员scipione号人质未公开
nsw总理方式避免马丁地方意识到警惕
发生的想法心脏人质受影响的家庭
lindt cafe很棒的勇敢的战士真主ikea dickhead
警方建议公民业务避免市场

停用词数据框 - 带有&#34;列表&#34;的单列作为标题。
AAA
AAAA
aaaaaaand
aaaaand
aaaargh
aaack
aaahh
aaahhhh
aaalll
AAAND
aaarse
亚琛
aadityanath

1 个答案:

答案 0 :(得分:1)

您可以尝试以下矢量化方法:

# create a string of stopwords wrapped in `\\<` and `\\>`
x <- paste(paste0("\\<", stopwords$list, "\\>"), collapse = "|")
# use x to replace the words using gsub
corpus$text <- gsub(x, "", corpus$text)

(在没有可重复的例子的情况下未进行测试)

说明paste和paste0的工作原理:

> ( stopwords <- letters[1:5] )
#[1] "a" "b" "c" "d" "e"

paste(paste0("\\<", stopwords, "\\>"), collapse = "|")
#[1] "\\<a\\>|\\<b\\>|\\<c\\>|\\<d\\>|\\<e\\>"

gsub中使用此功能将替换任何|用“”分隔停用词而不循环。从本质上讲,它会创建一个包含所有停用词的字符串,每个停用词包含在\\<\\>中,因为它们由逻辑OR(在R中为|)分隔。