Я пытаюсь отфильтровать столбец Символ на основе его формы \uxxxx
Это очень просто визуально, то есть, некоторые выглядят как $
, ¢
, £
, и другие , как \u058f
, \u060b
, \u07fe
.
Но я не могу понять это с помощью stringi
/dplyr
library(dplyr)
library(stringi)
df <- structure(list(Character = c("\\u0024", "\\u00A2", "\\u00A3",
"\\u00A4", "\\u00A5", "\\u058F", "\\u060B", "\\u07FE", "\\u07FF",
"\\u09F2", "\\u09F3", "\\u09FB", "\\u0AF1", "\\u0BF9", "\\u0E3F",
"\\u17DB", "\\u20A0", "\\u20A1", "\\u20A2", "\\u20A3"),
Symbol = c("$", "¢", "£", "¤", "¥", "\u058f", "\u060b", "\u07fe", "\u07ff",
"৲", "৳", "\u09fb", "\u0af1", "\u0bf9", "฿", "៛", "₠",
"₡", "₢", "₣")), row.names = c(NA, 20L), class = "data.frame")
Character Symbol
1 \\u0024 $
2 \\u00A2 ¢
3 \\u00A3 £
4 \\u00A4 ¤
5 \\u00A5 ¥
6 \\u058F \u058f
7 \\u060B \u060b
8 \\u07FE \u07fe
9 \\u07FF \u07ff
10 \\u09F2 ৲
11 \\u09F3 ৳
12 \\u09FB \u09fb
13 \\u0AF1 \u0af1
14 \\u0BF9 \u0bf9
15 \\u0E3F ฿
16 \\u17DB ៛
17 \\u20A0 ₠
18 \\u20A1 ₡
19 \\u20A2 ₢
20 \\u20A3 ₣
Что я пробовал
Я пытался использовать варианты, nchar
но не повезло
df$Symbol %>% nchar
# [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
df$Symbol %>% stri_unescape_unicode %>% nchar
# [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
df$Symbol %>% stri_escape_unicode %>% nchar
# [1] 1 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
Вопрос
Как можно отфильтровать по столбцу символов для всех строк вида $
, ¢
, и £
т.д. (и наоборот для строк нравится \u058f
, \u060b
, \u07fe
)?
Symbol
столбце (я чувствую, что этого должно быть достаточно, но я не могу понять, как отличить - это интересно, потому что человеческие глаза так легко видеть)utf8::utf8_valid()
но это может не различать существующий действительный Unicode и Unicode, который является действительным, но неназначенным. Можете ли вы немного рассказать о том, чего вы в конечном итоге пытаетесь достичь?Ответы:
Редактировать:
Для этого предназначена функция
glyphs_match()
изgdtools
пакета, однако использование ее не совсем вернуло ожидаемый результат. Я использую вLucida Console
качестве шрифта и получаю следующий вывод при использованииglyphs_match()
. Кажется, есть один глиф, который не отображается, но для которого возвращается функцияTRUE
. Возможно, другие пользователи могут объяснить, почему это так.Более ранний ответ - может работать только на Windows:
Будут различия в зависимости от вашего шрифта / системы, например, при выполнении вашего кода мой вывод не совпадает с тем, что вы предоставили:
Но один грубый способ захвата, если глиф существует:
Таким образом, глифы могут быть отфильтрованы по:
источник
Используйте
as.character.POSIXt
для «рендеринга» символов и дополнения пробелами. Символы Unicode в форме "\ uxxxx" будут напечатаны как один символ, а все остальные будут больше; тогда вы можете фильтровать по длине:Если в качестве «символа» у вас есть длинная строка (например, «aaaaaaaaaa ₣»), заполнение будет увеличено, и его необходимо учитывать, например:
источник