将文本修剪到最小的唯一长度

时间:2018-08-21 16:22:38

标签: r

我想裁剪一个唯一名称的向量。我希望向量中的每个项目都尽可能小,但仍可以保持唯一。我的真实数据中的条目很长。

这是我最小的可复制示例。

flavors <- c("Apple mango", "Apple", "Cherry", "Cranberry", "Cran raspberry")

我删除了所有空格。

flavor <- stringr::str_replace_all(flavors, " ", "")

我希望结果是一个看起来像这样的向量。

c("Applem", "Apple", "Cherry", "Cranb", "Cranr")

有什么想法吗?在我的真实数据集中,此向量是机器学习模型中使用的列。使用查找表的哈希算法会更好吗?我愿意接受想法。

3 个答案:

答案 0 :(得分:1)

如果只想获取唯一值,则可以使用digest包中提供的digest函数。

flavors <-
    c("Apple mango", "Apple", "Cherry", "Cranberry", "Cran raspberry")

vf <- Vectorize(FUN = digest::digest,
                vectorize.args = "object")

vf(object = flavors, algo = "crc32")

这将产生以下结果:

vf(object = flavors, algo = "crc32")
   Apple mango          Apple         Cherry      Cranberry Cran raspberry 
    "b8bd7ce5"     "f3bbf1aa"     "95671d86"     "b3e2a7b8"     "65abba84"

答案 1 :(得分:1)

我没有找到您想要的结果,但这是紧密而独特的。我只是不把Cranbe和Cranre带到Cranb和Cranr。它也不是很优雅(循环)。

maxLength <- max(unlist(lapply(X = flavor,FUN = str_length)))
stop <- FALSE
i <- 0
while (stop == FALSE) {
  i <- i + 1
  if (length(unique(substr(x = flavor,start = 1,stop = i))) == length(unique(flavor))) stop = TRUE
}
substr(x = flavor,start = 1,stop = i)
[1] "Applem" "Apple"  "Cherry" "Cranbe" "Cranra"

答案 2 :(得分:1)

好像您有一个概念,即不要将任何内容切成5个以下的字符,否则“ Apple”将缩短为“ A”,“ Cherry”将缩短为“ C”。因此...

-managedassembly