【问题标题】:subset/filter based on a frequency table基于频率表的子集/过滤器
【发布时间】:2017-06-30 01:49:55
【问题描述】:

我有一个带有一些文本数据的 df,例如

words <- data.frame(terms = c("qhick brown fox",
                              "tom dick harry", 
                              "cats dgs",
                              "qhick black fox"))

我已经能够根据包含拼写错误的任何行进行子集化:

library(qdap)
words[check_spelling(words$terms)$row,,drop=F]

但鉴于我有大量文本数据,我只想过滤出现频率更高的拼写错误:

> sort(which(table(which_misspelled(toString(unique(words$terms)))) > 1), decreasing = T)
qhick 
    2 

所以我现在知道“qhick”是一个常见的拼写错误。

然后,我如何根据此表对单词进行子集?所以只返回包含“qhick”的行?

【问题讨论】:

    标签: r qdap


    【解决方案1】:

    这些词本身就是您的sort() 函数的名称。如果你只有一个名字,你可以这样做:

    top_misspelled <- sort(which(table(which_misspelled(toString(unique(words$terms)))) > 1), decreasing = T)
    
    words[grepl(names(top_misspelled), words$terms), , drop = F]
    #            terms
    #1 qhick brown fox
    #4 qhick black fox
    

    但如果您有多个,您可以将它们折叠在一起以构建grepl 查找,例如:

    words[grepl(paste0(names(top_misspelled), collapse = "|"), words$terms), ,drop = F]
    

    非正则表达式选项也可以将每一行拆分为单词,然后如果该行中的任何单词与您感兴趣的字符串匹配,则返回该行:

    words[sapply(strsplit(as.character(words[,"terms"]), split=" "), function(x) any(x %in% names(top_misspelled))),
          ,drop = F]
    
    #            terms
    #1 qhick brown fox
    #4 qhick black fox
    

    【讨论】:

    • 感谢您的回答,很抱歉未能接受。实际上,我想将其打开一段时间,因为当单词字符串是另一个更大单词的一部分时,正则表达式方法可能会导致意外行为,例如“灾难”中的“猫”。
    • 没问题,另一个想法是使用strsplit 分割每一行,然后使用sapply 检查行中是否有任何元素匹配
    • 谢谢你的成功!我想知道是否有一种“dplyr esque”的方式来做到这一点,因为我认为我个人可以遵循非正则表达式方法的变化,但阅读起来很棘手。无论如何,再次感谢
    猜你喜欢
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2020-10-30
    • 2021-02-26
    相关资源
    最近更新 更多