2016-06-15 39 views
2

确定字符串是否包含非罗马字符/非英文字符的首选方法是什么(例如,是否为)字符?如何确定字符串是否包含R中的非罗马字符

+0

您的问题不属于好到现场指导。改述它,让你问问怎么做,更重要的是,展示你到目前为止所尝试过的。就目前来看,这个问题相当广泛,并且“寻找工具”。 –

+0

我不明白downvote。看起来像一个完全合理的问题,并且不能立即在搜索中找到。我总是很难找到char-to-integer函数。我永远不会记得它是char2Int,charToInt,chr2Int还是别的......因为它没有或那些。 –

回答

4

你可以决定是否字符串包含iconvgrep

# My example, because you didn't add your data 
characters <- c("ないでさ, satisfação, катынь, Work, Awareness, Potential, für") 
# First you convert string to vector of words 
characters.unlist <- unlist(strsplit(characters, split=", ")) 
# Then find indices of words with non-ASCII characters using ICONV 
characters.non.ASCII <- grep("characters.unlist", iconv(characters.unlist, "latin1", "ASCII", sub="characters.unlist")) 
# subset original vector of words to exclude words with non-ASCII characters 
data <- characters.unlist[-characters.non.ASCII] 
# convert vector back to a string 
dat.1 <- paste(data, collapse = ", ") 

# Now if you run 
characters.non.ASCII 
[1] 1 2 3 7 

非拉丁/非ASCII字符意味着第一,第二,第三和第七个索引是非ASCII字符,在我的情况下,第1,2,3和7个对应于:“ないでさ,satisfação,катыньand furr

您也可以运行

dat.1 #and the output will be all ASCII charaters 
[1] "Work, Awareness, Potential" 
5

你可以使用正则表达式/ grep来检查字符的十六进制值的可打印的ASCII字符范围之外:

x <- 'ないでさ' 
grep("[^\x20-\x7F]",x) 
#[1] 1 
grep("[^\x20-\x7F]","Normal text") 
#integer(0) 

如果你希望允许非打印(“控制”)来考虑“英语”,你可以将字符类的范围扩展到第一个参数grep以“\ x01”开始。有关使用字符类别参数的更多信息,请参阅?regex。有关如何将字符指定为Unicode,十六进制或八进制值的更多信息,请参阅?Quotes

的R.oo包具有转换功能,可能是有用的:

library(R.oo) 
?intToChar 
?charToInt 

是亨里克特松认为应该包括这些在他的包,这一事实对我说,没有一个方便的方法来做到这一点基地/默认R.他是一个长期使用R/guRu。

看到对方的回答促使这一努力似乎直截了当:

> is.na(iconv(c(x, "OrdinaryASCII") , "", "ASCII")) 
[1] TRUE FALSE 
+0

0x7F可能不可打印。 – sln

+0

难道这不取决于我们正在谈论的输出设备吗? TTY可能会退格。 R控制台从'iconv(“\ x7f”,“”,ASCII“)中返回”\ 177“(八进制),这与'R.oo :: intToChar(0x7f)'返回的相同。 –

+0

我认为这是DEL控制代码,但确定任何控制代码都会影响输出设备。 7位ASCII码是0x00-0x7F – sln

相关问题