dplyr-Filterbedingung zur Unterscheidung zwischen dem Unicode-Symbol und seiner Unicode-Darstellung

10

Ich versuche, die Symbolspalte danach zu filtern, ob sie vom Formular ist \uxxxx

Dies ist leicht visuell, das heißt, einige sehen aus wie $, ¢, £, und andere wie \u058f, \u060b, \u07fe.

Aber ich kann es nicht mit stringi/ herausfindendplyr

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      ₣

Was ich versucht habe

Ich habe versucht, Variationen zu verwenden, hatte ncharaber kein Glück


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

Frage

Wie kann ich auf das Symbol Spalte Filter für alle Zeilen der Form $, ¢, £usw. (und umgekehrt für Zeilen wie \u058f, \u060b, \u07fe)?

stevec
quelle
Haben Sie in diesem Fall versucht, Regex zu verwenden?
vpz
@vpz habe ich nicht, nein. Ich dachte, es gäbe eine "formellere" Art, dies zu tun, werde aber gerne Regex verwenden, wenn es zuverlässig funktioniert!
Stevec
Hat die Zeichendarstellung ein Muster für die Symbole?
vpz
@vpz Die einzige Information ist, was in der SymbolSpalte enthalten ist (ich denke, es sollte ausreichen, aber ich kann nicht herausfinden, wie man unterscheidet - was interessant ist, weil es für menschliche Augen so leicht zu sehen ist)
stevec
1
Sie können verwenden utf8::utf8_valid(), dies unterscheidet jedoch möglicherweise nicht zwischen vorhandenem gültigem Unicode und Unicode, der gültig, aber nicht zugewiesen ist. Können Sie etwas näher auf das eingehen, was Sie letztendlich erreichen wollen?
H 1.

Antworten:

7

Bearbeiten:

Die Funktion glyphs_match()aus dem gdtoolsPaket ist dafür ausgelegt, hat jedoch bei Verwendung nicht das erwartete Ergebnis zurückgegeben. Ich verwende Lucida Consoleals Schriftart und erhalte bei Verwendung die folgende Ausgabe glyphs_match(). Es scheint eine Glyphe zu geben, die nicht gerendert wird, für die die Funktion jedoch zurückkehrt TRUE. Vielleicht können andere Benutzer erklären, warum dies der Fall ist.

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

Frühere Antwort - funktioniert möglicherweise nur unter Windows:

Abhängig von Ihrer Schriftart / Ihrem System kann es zu Abweichungen kommen. Wenn Sie beispielsweise Ihren Code ausführen, stimmt meine Ausgabe nicht mit den von Ihnen angegebenen überein:

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>

Eine grobe Methode, um zu erfassen, ob die Glyphe vorhanden ist, ist:

 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

So können die Glyphen gefiltert werden durch:

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      ¢
H 1
quelle
2

Verwenden Sie as.character.POSIXtdiese Option, um Symbole zu rendern und Leerzeichen einzufügen. Unicode-Zeichen in der Form "\ uxxxx" werden als einzelnes Zeichen gedruckt und alle anderen werden größer. dann können Sie nach Länge filtern:

# To keep 'single char' symbols e.g. "$":
df %>% filter(nchar(as.character.POSIXt(Symbol)) >= 2)

# Or for 'unicode format' symbols e.g. "\u07fe":
df %>% filter(nchar(as.character.POSIXt(Symbol)) == 1)

Wenn Sie eine lange Zeichenfolge als 'Symbol' haben (z. B. "aaaaaaaaaa ₣"), wird die Polsterung erhöht und muss berücksichtigt werden, z

# To keep 'single char' symbols e.g. "$":
df %>% filter(nchar(as.character.POSIXt(Symbol)) >= 11)

# Or for 'unicode format' symbols e.g. "\u07fe":
df %>% filter(nchar(as.character.POSIXt(Symbol)) <= 10)
jared_mamrot
quelle