यूनिकोड प्रतीक और इसके यूनिकोड प्रतिनिधित्व के बीच अंतर करने के लिए dplyr फिल्टर स्थिति


10

मैं प्रतीक के कॉलम को फ़िल्टर करने की कोशिश कर रहा हूं कि यह किस रूप में है \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)?


क्या आपने इस मामले में रेगेक्स का उपयोग करने की कोशिश की?
vpz

@vpz मैंने नहीं, नहीं। मैंने तर्क दिया कि इसे करने का कुछ 'अधिक औपचारिक' तरीका होगा, लेकिन अगर यह मज़बूती से काम करे तो ख़ुशी से रेगेक्स का उपयोग करेगा!
stevec

क्या चरित्र प्रतिनिधित्व के प्रतीकों के लिए कुछ पैटर्न है?
vpz

@vpz एकमात्र जानकारी है जो Symbolकॉलम में निहित है (मुझे लगता है कि यह पर्याप्त होना चाहिए, लेकिन मैं अंतर करने के लिए काम नहीं कर सकता - जो दिलचस्प है क्योंकि यह मानव आंखों को देखने के लिए बहुत आसान है)
चरण

1
आप उपयोग कर सकते हैं utf8::utf8_valid()लेकिन यह मौजूदा मान्य यूनिकोड और यूनिकोड के बीच अंतर नहीं कर सकता है जो मान्य है लेकिन अनसाइनड है। क्या आप उस चीज़ पर थोड़ा विस्तार कर सकते हैं जिसे आप अंततः हासिल करने की कोशिश कर रहे हैं?
एच 1

जवाबों:


7

संपादित करें:

पैकेज 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

पहले उत्तर - केवल विंडोज पर काम कर सकते हैं:

आपके फ़ॉन्ट / सिस्टम के आधार पर भिन्नता होगी, उदाहरण के लिए, जब आपका कोड चल रहा हो तो मेरा आउटपुट आपके द्वारा प्रदान किए गए से मेल नहीं खाता:

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>

लेकिन ग्लिफ़ मौजूद होने पर कैप्चर करने का एक कच्चा तरीका है:

 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

तो ग्लिफ़ को फ़िल्टर किया जा सकता है:

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      ¢

2

as.character.POSIXtरिक्त स्थान के साथ प्रतीकों और पैड को 'रेंडर' करने के लिए उपयोग करें । "\ Uxxxx" फॉर्म में यूनिकोड वर्णों को एकल वर्ण के रूप में मुद्रित किया जाएगा और अन्य सभी बड़े होंगे; फिर आप लंबाई के अनुसार फ़िल्टर कर सकते हैं:

# 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)

यदि आपके पास 'प्रतीक' के रूप में एक लंबी स्ट्रिंग है (उदाहरण के लिए "आ आ आ आ आ" ") तो पैडिंग बढ़ जाएगी और उदा।

# 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.