use*_*745 9 r stringr dplyr stringi
我正在尝试根据它是否为表单来过滤符号列 \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 ?
Run Code Online (Sandbox Code Playgroud)
我曾尝试使用变体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
Run Code Online (Sandbox Code Playgroud)
我怎样才能在符号列过滤所有形式的行$,¢,£等(相反的行喜欢\u058f,\u060b,\u07fe)?
编辑:
该功能glyphs_match()从gdtools然而包是专为这个,用它并没有完全返回预期的结果。我正在Lucida Console用作我的字体并在使用glyphs_match(). 似乎有一个字形没有被渲染,但函数会为其返回TRUE。也许其他用户可以解释为什么会这样。
df$glyph_match <- gdtools::glyphs_match(df$Symbol, fontfile = "C:\\WINDOWS\\Fonts\\lucon.TTF")
df
Character Symbol glyph_match
1 \\u0024 $ TRUE
2 \\u00A2 ¢ TRUE
3 \\u00A3 £ TRUE
4 \\u00A4 ¤ TRUE
5 \\u00A5 ¥ TRUE
6 \\u058F <U+058F> FALSE
7 \\u060B <U+060B> FALSE
8 \\u07FE <U+07FE> FALSE
9 \\u07FF <U+07FF> FALSE
10 \\u09F2 <U+09F2> FALSE
11 \\u09F3 <U+09F3> FALSE
12 \\u09FB <U+09FB> FALSE
13 \\u0AF1 <U+0AF1> FALSE
14 \\u0BF9 <U+0BF9> FALSE
15 \\u0E3F <U+0E3F> FALSE
16 \\u17DB <U+17DB> FALSE
17 \\u20A0 <U+20A0> FALSE
18 \\u20A1 ¢ TRUE
19 \\u20A2 <U+20A2> FALSE
20 \\u20A3 <U+20A3> TRUE
Run Code Online (Sandbox Code Playgroud)
较早的答案 - 可能仅适用于 Windows:
根据您的字体/系统,会有变化,例如,当运行您的代码时,我的输出与您提供的不匹配:
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")
df
Character Symbol
1 \\u0024 $
2 \\u00A2 ¢
3 \\u00A3 £
4 \\u00A4 ¤
5 \\u00A5 ¥
6 \\u058F <U+058F>
7 \\u060B <U+060B>
8 \\u07FE <U+07FE>
9 \\u07FF <U+07FF>
10 \\u09F2 <U+09F2>
11 \\u09F3 <U+09F3>
12 \\u09FB <U+09FB>
13 \\u0AF1 <U+0AF1>
14 \\u0BF9 <U+0BF9>
15 \\u0E3F <U+0E3F>
16 \\u17DB <U+17DB>
17 \\u20A0 <U+20A0>
18 \\u20A1 ¢
19 \\u20A2 <U+20A2>
20 \\u20A3 <U+20A3>
Run Code Online (Sandbox Code Playgroud)
但是一种粗略的捕获字形是否存在的方法是:
nchar(capture.output(cat(df$Symbol, sep = "\n"))) == 1
[1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[18] TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
所以字形可以通过以下方式过滤:
library(dplyr)
df %>%
filter(nchar(capture.output(cat(Symbol, sep = "\n"))) == 1)
Character Symbol
1 \\u0024 $
2 \\u00A2 ¢
3 \\u00A3 £
4 \\u00A4 ¤
5 \\u00A5 ¥
6 \\u20A1 ¢
Run Code Online (Sandbox Code Playgroud)