我的数据已经在数据框中,每行一个令牌。我想过滤掉包含停用词的行。
数据框如下所示:
docID <- c(1,2,2)
token <- c('the', 'cat', 'sat')
count <- c(10,20,30)
df <- data.frame(docID, token, count)
我已尝试过以下内容,但收到错误:
library(tidyverse)
library(tidytext)
library(topicmodels)
library(stringr)
data('stop_words')
clean_df <- df %>%
anti_join(stop_words, by=df$token)
错误:
Error: `by` can't contain join column `the`, `cat`, `sat` which is missing from LHS
我该如何解决这个问题?
答案 0 :(得分:3)
设置anti_join()
时,需要在左侧和右侧说出列名称。在tidytext中的stop_words
数据对象中,该列称为word
,在您的数据框中,该列称为token
。
library(tidyverse)
library(tidytext)
docID <- c(1, 2, 2, 2, 3)
token <- c("the", "cat", "sat", "on-the-mat", "with3hats")
count <- c(10, 20, 30, 10, 20)
df <- data_frame(docID, token, count)
clean_df <- df %>%
anti_join(stop_words, by= c("token" = "word"))
clean_df
#> # A tibble: 4 x 3
#> docID token count
#> <dbl> <chr> <dbl>
#> 1 2.00 cat 20.0
#> 2 2.00 sat 30.0
#> 3 2.00 on-the-mat 10.0
#> 4 3.00 with3hats 20.0
请注意,“the”现已消失,因为它位于stop_words
数据集中。
在评论中,您询问了有关删除包含标点符号或数字的令牌的问题。我会使用filter()
(如果您愿意,也可以使用filter()
删除停用词。)
clean_df <- df %>%
filter(!str_detect(token, "[:punct:]|[:digit:]"))
clean_df
#> # A tibble: 3 x 3
#> docID token count
#> <dbl> <chr> <dbl>
#> 1 1.00 the 10.0
#> 2 2.00 cat 20.0
#> 3 2.00 sat 30.0
如果要同时执行这两项操作,请使用管道使用两行来构建对象。