在R中将字符串转换为二进制向量

Posted

技术标签:

【中文标题】在R中将字符串转换为二进制向量【英文标题】:Convert string into binary vector in 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 组合,但我并不走运。有没有直接的方法可以实现这一目标?到目前为止,我发现的唯一解决方案太复杂了,我认为我遗漏了一些明显的东西。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于在R中将字符串转换为二进制向量的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中将二进制数组转换为十进制(相当于 R readBin?)

在 C++ 中将字符串转换为向量

在Postgres中将十六进制字符串转换为bigint [重复]

在汇编中将无符号字符转换为浮点数(为浮点向量计算做准备)

如何在 C++ 中将 uint8_t 的向量转换为 std::string?

在 Java 中将字符串转换为十六进制