我想测试一个字符串,看看哪些元素实际上可以是数字.我可以使用正则表达式来测试整数是否成功,但我希望看到哪些元素具有所有数字和1或更少的小数.以下是我尝试过的内容:
x <- c("0.33", ".1", "3", "123", "2.3.3", "1.2r")
!grepl("[^0-9]", x) #integer test
grepl("[^0-9[\\.{0,1}]]", x) # I know it's wrong but don't know what to do
Run Code Online (Sandbox Code Playgroud)
我正在寻找逻辑输出,所以我希望得到以下结果:
[1] TRUE TRUE TRUE TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
jor*_*ran 55
也许有一些原因,你的数据的其他部分更复杂,会破坏这一点,但我的第一个想法是:
> !is.na(as.numeric(x))
[1] TRUE TRUE TRUE TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
正如下面Josh O'Brien所说,这将不会像7L
R解释器那样解析为整数7.如果你需要将它们包含为"似乎合理的数字",一条路线就是用正则表达式来挑选它们第一,
x <- c("1.2","1e4","1.2.3","5L")
> x
[1] "1.2" "1e4" "1.2.3" "5L"
> grepl("^[[:digit:]]+L",x)
[1] FALSE FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
...然后使用gsub
和索引从那些元素中剥离"L" .
我最近遇到了类似的问题,我试图编写一个函数来格式化从另一个函数作为字符串传递的值.格式化的值最终会在一个表中结束,我想创建逻辑来识别数字的NA,字符串和字符表示,以便我可以sprintf()
在生成表之前应用它们.
虽然阅读起来比较复杂,但我确实喜欢这种grepl()
方法的稳健性.我认为这会得到评论中提到的所有例子.
x <- c("0",37,"42","-5","-2.3","1.36e4","4L","La","ti","da",NA)
y <- grepl("[-]?[0-9]+[.]?[0-9]*|[-]?[0-9]+[L]?|[-]?[0-9]+[.]?[0-9]*[eE][0-9]+",x)
Run Code Online (Sandbox Code Playgroud)
这将被评估为(格式化以帮助可视化):
x
[1] "0" "37" "42" "-5" "-2.3" "1.36e4" "4L" "La" "ti" "da" NA
y
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
正则表达式为TRUE:
如果数据集中包含数字较差的数字,则可以添加附加项以处理小数而不带前导数字或带小数点但不是小数点后的数字.
避免使用varhandlecheck.numeric()
包重新发明轮子。
该函数接受以下参数:
v特征向量或因子向量。(强制的)
na.rm逻辑。该函数应该忽略 NA 吗?默认值为 FLASE,因为 NA 可以转换为数字。(选修的)
only.integer逻辑。只检查整数,不接受浮点数。默认值为 FALSE。(选修的)
异常包含应被视为有效以转换为数字的字符串的字符向量。(选修的)
ignore.whitespace逻辑。在评估向量是否可以转换为数字之前,忽略前导和尾随空白字符。默认值为 TRUE。(选修的)