如何获取包含某个特征的文档的百分比

How to get the percentage of documents that contain a feature(s)

我正在使用此解决方案 () 查找包含我的数据集中一组特征中的任何一个特征的文档数量。只要文档包含任何一个单词,我就希望它 return TRUE.

我让它工作了,但它只在某些时候工作,我不明白为什么。删除或添加单词有时有效,但有时无效。这是我使用的代码(复合词组在dfm中已经是“tokens_compound”)

thetarget <- c("testing", "test", "example words", "example")

df <- data.frame(docname = docnames(dfm),
                 Year = docvars(dfm, c("Year")),
                 contains_target = rowSums(dfm[, thetarget]) > 0,
                 row.names = NULL)

我有时会遇到错误

Error in h(simpleError(msg, call)) : 
  error in evaluating the argument 'x' in selecting a method for function 'rowSums': 
Subscript out of bounds

TIA

编辑(创建 table 显示包含任何目标词的文档的年份和数量的脚本):

 df2 <- df %>%
  mutate_if(is.logical, as.character) %>%
  filter(!str_detect(contains_target, "FALSE")) %>%
  group_by(Year) %>%
    summarise(n = n())        

您收到错误是因为在您创建的某些 dfm 对象中,并非 thetarget 中的所有特征都在您创建的对象 dfm 中。

这里有一个方法可以避免这种情况,使用 docfreq():

library("quanteda")
## Package version: 3.1.0
## Unicode version: 13.0
## ICU version: 69.1
## Parallel computing: 12 of 12 threads used.
## See https://quanteda.io for tutorials and examples.

thetarget <- c("nuclear", "congress", "economy", "_not_a_feature_")

dfmat <- tokens(data_corpus_inaugural) %>%
  tokens_select(thetarget) %>%
  dfm()

docfreq(dfmat) / ndoc(dfmat)
##    economy   congress    nuclear 
## 0.52542373 0.49152542 0.08474576

要得到题目中的data.frame:

df <- data.frame(
  docname = docnames(dfmat),
  Year = docvars(dfmat, c("Year")),
  contains_target = as.logical(rowSums(dfmat)),
  row.names = NULL
)

head(df)
##           docname Year contains_target
## 1 1789-Washington 1789            TRUE
## 2 1793-Washington 1793           FALSE
## 3      1797-Adams 1797            TRUE
## 4  1801-Jefferson 1801            TRUE
## 5  1805-Jefferson 1805           FALSE
## 6    1809-Madison 1809            TRUE