【问题标题】:Creating new variables from word list and assigning 1 or 0 if the word appears in the string of a separate variable in R从单词列表创建新变量,如果单词出现在 R 中单独变量的字符串中,则分配 1 或 0
【发布时间】:2021-12-05 21:15:08
【问题描述】:

我有一个变量,其中观察将由一个人放入各种注释。任何给定观察中的一些词都可能是需要跟踪的关键词。

如果我有一个关键词列表,是否有一种简化的方法可以从该列表中创建变量,然后搜索现有的观察结果以标记该词是否在其中?一个额外的组成部分是,由于人为因素,不能指望单词按特定顺序排列,或者可能会省略空格等分隔符,字母大写/小写。也有可能像“航班”这样的词可能缺少“s”。因为关键字可能会发生变化,是否还有一种方法可以对其进行编码,以便将单词创建为可以更新的值,然后重新运行以更新变量?

在关键字列表下方的df中,我正在寻找abc、xyz、航班。

df <- read.table(text =
                   "ID Notes
ID-0001   'ABC project xyz'
ID-0002   'XYZ'
ID-0003   'ABCschedule flightsok test'
ID-0004   'flight, abc' 
ID-0005   'normal notes no key'", header = T)

所需的输出如下所示:

desired.output <- read.table(text =
                               "ID Notes abc xyz flights
ID-0001   'ABC project xyz'  1  1  0  
ID-0002   'XYZ' 0  1  0
ID-0003   'ABCschedule flightsok'  1  0  1
ID-0004   'flight, abc' 1  0  1 
ID-0005   'normal notes no key'  0  0  0 ", header = T)

我发现了这个类似的问题,但它并不是我想要的,因为变量名是从观察中的每个单词创建的。 R: Splitting a string to different variables and assign 1 if string contains this word

感谢您的帮助!

【问题讨论】:

    标签: r string


    【解决方案1】:

    我们可能会为此使用grepl

    transform(df, abc = +(grepl('\\babc', Notes, ignore.case = TRUE)), 
         xyz = +(grepl('\\bxyz\\b', Notes, ignore.case = TRUE)), 
         flights = +(grepl('\\bflights?', Notes, ignore.case = TRUE)))
           ID                      Notes abc xyz flights    
    1 ID-0001            ABC project xyz   1   1       0
    2 ID-0002                        XYZ   0   1       0
    3 ID-0003 ABCschedule flightsok test   1   0       1
    4 ID-0004                flight, abc   1   0       1
    5 ID-0005        normal notes no key   0   0       0
    

    或者只是遍历感兴趣的单词并使用grepl

    df[c('abc', 'xyz', 'flights')] <- +(sapply(c('abc', 'xyz', 'flights'), function(x) grepl(x, df$Notes)))
    

    【讨论】:

    • 您的解决方案区分大小写吗?我注意到在第 3 行中,开头的 ABC 没有被计算在内(有时人为错误导致单词没有空格),在第 4 行中,flight 没有“s”并且没有标记。
    • @ks54 我会在我的更新中添加单词边界 (\\b) 和 ignore.case = TRUE
    • 感谢您的回复,您显示的结果仍有问题。当我复制并粘贴您的代码时,我得到的结果略有不同。在第 2 行中,“XYZ”是大写的,不会出现在结果中。第 3 行有同样的问题,结果中没有显示“ABC”。当我运行它时,区别在于第 3 行,它也从结果中省略了“航班”。有什么想法吗?
    • @ks54 您现在可以查看更新。我想你也想匹配部分字符串。
    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 2017-10-25
    • 2022-01-09
    • 1970-01-01
    • 2020-12-03
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多