将字符串转换为可读的R文本

ha5z0ras  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(179)

我有一些输入文本,看起来像这样:

names <- c("🅴🅽🆈🅸🆂 🆂🆄🅰🆉🅰", "𝐕𝐈𝐂𝐓𝐎𝐑𝐈𝐀 𝐋𝐀𝐍𝐆𝐄𝐋")
users <- c("user1", "user2")

df <- cbind(names, users) %>% as.data.frame()

我尝试将其转换为R中可读的文本,因为现在,它似乎并没有这样标识它。例如,如果我尝试将它们转换为小写:

df$lowername <- tolower(df$names)

它只会吐出同样的东西。
有没有什么方法可以把这样的文本字符串转换成R中可读的文本格式,这样我就可以像处理其他字符串一样处理/清理文本了?
所以名字就变成了“恩尼斯·苏阿扎”和“维多利亚·兰格尔”?

rryofs0p

rryofs0p1#

这里有一个选择

library(Unicode)
library(stringr)
unname(str_to_title(sapply(df$names, \(x) {
   x <- u_char_name(as.u_char(utf8ToInt(x)))
   paste(ifelse(x != "SPACE", substring(x, nchar(x)), " "), collapse = "")
 })))
  • 输出
[1] "Enyis Suaza"     "Victoria Langel"
whlutmcx

whlutmcx2#

一个不完美的方法是识别代表字母的ASCII码,然后找出ASCII码和代表字母“正常”文本的代码之间的区别。由于这里有多种非标准类型,不幸的是(据我所知),必须对每种类型都进行区分。

utf8ToInt("🅴") - utf8ToInt("E")
# [1] 127279

utf8ToInt("𝐕") - utf8ToInt("V")
# [1] 119743

由于所有字母之间的差异都相同,因此您可以使用utf8ToIntintToUtf8应用此差异来转换:

# using `names` instead of `names` since `names` is a function 
nnames <- c("🅴🅽🆈🅸🆂 🆂🆄🅰🆉🅰", "𝐕𝐈𝐂𝐓𝐎𝐑𝐈𝐀 𝐋𝐀𝐍𝐆𝐄𝐋")

# Use Vectorize() to vectorize the utf8ToInt
vec.utf8ToInt <- Vectorize(utf8ToInt)

# the `ifelse` accounts for the normal space (" ") between the names
enyis_ASCII <- ifelse(vec.utf8ToInt(nnames)[[1]] - 127279 < 0, 
                      32, vec.utf8ToInt(nnames)[[1]] - 127279)
enyis_char <- intToUtf8(enyis_ASCII)
enyis_char
# [1] "ENYIS SUAZA"

victoria_ASCII <- ifelse(vec.utf8ToInt(nnames)[[2]] - 119743 < 0, 
                         32, vec.utf8ToInt(nnames)[[2]] - 119743)
victoria_char <- intToUtf8(victoria_ASCII)
victoria_char
# [1] "VICTORIA LANGEL"

您可以通过在函数中进行 Package 并将格式类型保留为向量的名称来使其更简洁一些,但仍然特定于格式类型:

fixchars <- Vectorize(function(x){
  ints <- vec.utf8ToInt(x)
  if(all((ints[!(ints == 32)] - 127279) %in% 65:90)){
    ints[!(ints == 32)] <- ints[!(ints == 32)] - 127279
  }
  if(all((ints[!(ints == 32)] - 119743) %in% 65:90)){
    ints[!(ints == 32)] <- ints[!(ints == 32)] - 119743
  }
  intToUtf8(ints)
})

fixchars(nnames)
#  🅴🅽🆈🅸🆂 🆂🆄🅰🆉🅰   𝐕𝐈𝐂𝐓𝐎𝐑𝐈𝐀 𝐋𝐀𝐍𝐆𝐄𝐋 
# "ENYIS SUAZA" "VICTORIA LANGEL"

我希望一个比我更聪明的编码器可以通过使它可扩展来改进这个答案。好问题-祝你好运!

相关问题