处理 R 中带有变音符号的字符数
Handling count of characters with diacritics in R
我正在尝试获取带有变音符号的字符串中的字符数,但我无法获得正确的结果。
> x <- "n̥ala"
> nchar(x)
[1] 5
我想要得到的是 4
,因为 n̥
应该被视为一个字符(即变音符号不应被单独视为字符,即使有多个变音符号叠加在上面一个基本字符)。
我怎样才能得到这样的结果?
您可以采取变通办法。这是一个:
dia.count <- function(string) {
y <- unlist(strsplit(string, ''))
length(grep('[A-Za-z0-9]', y, value=T))
}
dia.count(x)
[1] 4
最好直接处理字符编码的方法。这又是一种解决方法。一般情况下,可能会有包或功能组合来全面解决您的问题。
更新
这是评论提供的另一种解决方法:
nchar(sub('[^A-Za-z]+', '', x))
[1] 4
dia.count
函数在字符串中查找大写和小写字母以及数字。添加的脚本恰恰相反;它消除了所有不是字母、大写或其他形式的字符串标记。信用@akrun
我能在包 stringi
中找到的最好的是 str_enc_toascii
,它给出:
stri_enc_toascii(x)
[1] "n2ala"
给定该输出,将除字母以外的所有内容替换掉将提供所需的输出。
nchar(sub('[^A-Za-z]', '', stri_enc_toascii(x)))
[1] 4
在评论中找到一般答案和快速脚本之间的良好平衡:
nchar(iconv("n̥ala", to="ASCII", sub=""))
[1] 4
这使用 base R
函数 iconv
,为您转换字符串。信用@Molx
这是我的解决方案。这个想法是拼音字母可以有一个 unicode 表示,然后:
使用Unicode
包;它提供的功能 Unicode_alphabetic_tokenizer
是:
Tokenization first replaces the elements of x by their Unicode
character sequences. Then, the non- alphabetic characters (i.e., the
ones which do not have the Alphabetic property) are replaced by
blanks, and the corresponding strings are split according to the
blanks.
在此之后我使用了 nchar
但是因为将它拆分为前一个函数的两个子字符串我使用了 sum
。
sum(nchar(Unicode_alphabetic_tokenizer(x)))
[1] 4
我相信这个包在这种情况下会非常有用,但我不是专家,我不知道我的解决方案是否适用于所有涉及拼音字母的问题。也许其他示例可能有助于说明我的解决方案的有效性。
效果不错
这是另一个例子:
> x <- "e̯ ʊ̯"
> x
[1] "e̯ ʊ̯"
> nchar(x)
[1] 5
> sum(nchar(Unicode_alphabetic_tokenizer(x)))
[1] 2
p.s。
代码中只有一个 "
但是复制并粘贴它,出现第二个。我不知道为什么会这样。
这是一个使用我维护的 qdap 包的解决方案:
x <- "n?ala"
library(qdap)
character_count(word)
## [1] 4
我正在尝试获取带有变音符号的字符串中的字符数,但我无法获得正确的结果。
> x <- "n̥ala"
> nchar(x)
[1] 5
我想要得到的是 4
,因为 n̥
应该被视为一个字符(即变音符号不应被单独视为字符,即使有多个变音符号叠加在上面一个基本字符)。
我怎样才能得到这样的结果?
您可以采取变通办法。这是一个:
dia.count <- function(string) {
y <- unlist(strsplit(string, ''))
length(grep('[A-Za-z0-9]', y, value=T))
}
dia.count(x)
[1] 4
最好直接处理字符编码的方法。这又是一种解决方法。一般情况下,可能会有包或功能组合来全面解决您的问题。
更新
这是评论提供的另一种解决方法:
nchar(sub('[^A-Za-z]+', '', x))
[1] 4
dia.count
函数在字符串中查找大写和小写字母以及数字。添加的脚本恰恰相反;它消除了所有不是字母、大写或其他形式的字符串标记。信用@akrun
我能在包 stringi
中找到的最好的是 str_enc_toascii
,它给出:
stri_enc_toascii(x)
[1] "n2ala"
给定该输出,将除字母以外的所有内容替换掉将提供所需的输出。
nchar(sub('[^A-Za-z]', '', stri_enc_toascii(x)))
[1] 4
在评论中找到一般答案和快速脚本之间的良好平衡:
nchar(iconv("n̥ala", to="ASCII", sub=""))
[1] 4
这使用 base R
函数 iconv
,为您转换字符串。信用@Molx
这是我的解决方案。这个想法是拼音字母可以有一个 unicode 表示,然后:
使用Unicode
包;它提供的功能 Unicode_alphabetic_tokenizer
是:
Tokenization first replaces the elements of x by their Unicode character sequences. Then, the non- alphabetic characters (i.e., the ones which do not have the Alphabetic property) are replaced by blanks, and the corresponding strings are split according to the blanks.
在此之后我使用了 nchar
但是因为将它拆分为前一个函数的两个子字符串我使用了 sum
。
sum(nchar(Unicode_alphabetic_tokenizer(x)))
[1] 4
我相信这个包在这种情况下会非常有用,但我不是专家,我不知道我的解决方案是否适用于所有涉及拼音字母的问题。也许其他示例可能有助于说明我的解决方案的有效性。
效果不错
这是另一个例子:
> x <- "e̯ ʊ̯"
> x
[1] "e̯ ʊ̯"
> nchar(x)
[1] 5
> sum(nchar(Unicode_alphabetic_tokenizer(x)))
[1] 2
p.s。
代码中只有一个 "
但是复制并粘贴它,出现第二个。我不知道为什么会这样。
这是一个使用我维护的 qdap 包的解决方案:
x <- "n?ala"
library(qdap)
character_count(word)
## [1] 4