【问题标题】:Convert string into binary vector in R在R中将字符串转换为二进制向量
【发布时间】:2021-12-29 10:37:01
【问题描述】:

我正在尝试通过描述符对一组期刊进行聚类,并且我一直在考虑将描述符转换为二进制向量,而不是使用字符串距离(到目前为止我一直在使用)以避免匹配“催化”等问题" 和 "分析" 或为(不希望的)部分匹配匹配长字符串。

为了实现这个想法,我已将期刊可能出现的每个描述符按字母顺序分成一组 266 个字符串 (isolated_cat)。

dput(head(isolated_cat))
c("Accounting", "AcousticsUltrasonics", "AdvancedSpecializedNursing", 
"AerospaceEngineering", "Aging", "AgriculturalBiologicalSciences"
)

对于我的数据框中的每个期刊,我都有一个带有一组描述符的列,例如

journals_STEM$Categories4dist[1]
[1] "Biomaterials ElectronicOpticalMagneticMaterials Energy MaterialsChemistry SurfacesCoatingsFilms"

我期望的输出是一个 266 长的向量,其中 isolated_cat 中的每个类别都有 0 和 1,表示描述符是否包含该词(之后我想测试 PCA 和不同的聚类方法来将期刊分成组) .

首先,我试过了

as.numeric(isolated_cat %in% aux$Categories4dist[i])

显然(我后来注意到)仅适用于由单个类别定义的期刊。我一直在尝试不同的 grep 组合,但我并不走运。有没有直接的方法可以实现这一目标?到目前为止,我发现的唯一解决方案太复杂了,我认为我遗漏了一些明显的东西。

【问题讨论】:

    标签: r vector grep match


    【解决方案1】:

    这是带有lapplygrepl 的基本R 选项-

    journals_STEM[isolated_cat] <- lapply(isolated_cat, function(x) 
                +(grepl(x, journals_STEM$Categories4dist, ignore.case = TRUE)))
    

    上面的内容也会匹配一个子字符串,意思是“at”会匹配“cat”。如果您需要完全匹配,请使用单词边界 (\\b)。

    journals_STEM[isolated_cat] <- lapply(paste0('\\b', isolated_cat, '\\b'), 
          function(x) +(grepl(x, journals_STEM$Categories4dist, ignore.case = TRUE)))
    

    【讨论】:

      【解决方案2】:

      某事。喜欢:

      library(stringr)
      
      isolatedcat <- c("Accounting", "AcousticsUltrasonics", "AdvancedSpecializedNursing", "AerospaceEngineering", "Aging", "AgriculturalBiologicalSciences", 'Biomaterials')
      
      
      Categories4dist <- str_split('Biomaterials ElectronicOpticalMagneticMaterials Energy MaterialsChemistry SurfacesCoatingsFilms', ' ', simplify = TRUE)
      
      as.data.frame(sapply(isolatedcat, function(x) as.numeric(str_detect(x, Categories4dist))))
      

      给出:

        Accounting AcousticsUltrasonics AdvancedSpecializedNursing
      1          0                    0                          0
      2          0                    0                          0
      3          0                    0                          0
      4          0                    0                          0
      5          0                    0                          0
        AerospaceEngineering Aging AgriculturalBiologicalSciences Biomaterials
      1                    0     0                              0            1
      2                    0     0                              0            0
      3                    0     0                              0            0
      4                    0     0                              0            0
      5                    0     0                              0            0
      

      【讨论】:

        猜你喜欢
        • 2020-01-19
        • 2018-01-11
        • 2014-11-07
        • 2021-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多