在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】:这是带有lapply
和grepl
的基本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?)
在Postgres中将十六进制字符串转换为bigint [重复]