유니 코드 기호와 유니 코드 표현을 구별하기위한 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열에 포함 된 것입니다 ( 충분히 느껴야 한다고 생각 하지만 구별하는 방법을 알아낼 수 없습니다.-사람의 눈으로 쉽게 볼 수 있기 때문에 흥미 롭습니다)
stevec

1
사용할 수는 utf8::utf8_valid()있지만 기존의 유효한 유니 코드와 유효하지만 할당되지 않은 유니 코드를 구별하지 못할 수 있습니다 . 궁극적으로 달성하고자하는 것을 조금 확장 할 수 있습니까?
H

답변:


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

이전 답변-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>

그러나 글리프가 존재하는 경우 캡처하는 한 가지 조잡한 방법은 다음과 같습니다.

 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)

긴 문자열이 '기호'(예 : "aaaaaaaaaa as") 인 경우 패딩이 증가하고 예를 들어 설명해야합니다.

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