ইউনিকোড প্রতীক এবং এর ইউনিকোড উপস্থাপনার মধ্যে পার্থক্য করার জন্য 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 কেবলমাত্র তথ্যটি 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প্রতীকগুলি 'রেন্ডার' করতে এবং স্পেস সহ প্যাড ব্যবহার করুন । "Xx 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)

আপনার যদি একটি চিহ্ন হিসাবে দীর্ঘ স্ট্রিং থাকে (যেমন "aaaaaaaaaa ₣") প্যাডিং বৃদ্ধি করা হবে এবং উদাহরণস্বরূপ হিসাব করা দরকার

# 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.