小编owe*_*n88的帖子

对整数进行反直观测试:63 =(45 x 1.4)= 62

我写了一个(可能不是特别好!)函数来测试一个数字是否是整数:

is.wholeNumber <- function(x) x == floor(x)
Run Code Online (Sandbox Code Playgroud)

一般来说,这个功能对我的目的来说很好,因为我真的只考虑我用一些判断位置测试数字的情况,所以我天真的理解是机器精度不应该是一个因素.

当我在45 x 1.4 = 63的情况下应用此功能时,我得到了

> is.wholeNumber( 45 * 1.4)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

这似乎是因为R的楼层功能没有像我期望的那样进行评估:

> floor(45 * 1.4)
[1] 62
Run Code Online (Sandbox Code Playgroud)

实际上应该是63.


在做一些阅读时,我遇到了这篇关于如何在R中编码的流行帖子.最高投票的答案提示了这个功能

is.wholeNumber <- function(x) ( x %% 1 ) == 0
Run Code Online (Sandbox Code Playgroud)

因为我得到了,这似乎在我的背景下似乎不起作用

> (45 * 1.4 ) %% 1
[1] 1
Run Code Online (Sandbox Code Playgroud)

第二个最受欢迎的帖子建议使用

is.wholeNumber <- function(x) all.equal(x, as.integer(x))
Run Code Online (Sandbox Code Playgroud)

虽然这不再起作用,但确实给出了意想不到的明显输出

> is.wholeNumber( 45 * 1.4)
[1] "Mean relative difference: 0.01587302"
Run Code Online (Sandbox Code Playgroud)

我现在已经在干净的R工作室工作区和R终端(R 3.4.2 Short Summer)中尝试了这个并重复了这个问题.我有兴趣知道:

  1. 人们可以在他们的机器上重现这个问题吗?
  2. 为什么我得到这个反直觉的结果?
  3. 解决这个问题的正确方法是什么?

r

10
推荐指数
1
解决办法
148
查看次数

间距矢量按规则模式

我有一个矢量

vec <- c("ab", "#4", "gw", "#29", "mp", "jq", "#35", "ez")
Run Code Online (Sandbox Code Playgroud)

它通常遵循两个不同字符串序列之间交替的模式(第一个序列全部是字母顺序,第二个序列是数字,符号为#).

但是有些情况下没有出现#term:所以在上面mp和之间jq,然后再次出现ez.我想定义一个用字符串"填补空白"的函数#,这样我就可以输出:

 [1] "ab" "#4" "gw" "#29" "mp" "#" "jq" "#35" "ez" "#"
Run Code Online (Sandbox Code Playgroud)

然后我将转换为数据框

   V1  V2
1  ab  #4
2  gw  #29
3  mp  #
4  jq  #35
5  ez  #
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的尝试相当笨重,依赖于遍历向量并填补空白.我有兴趣看到更优雅的解决方案.


我的解决方案

greplSpace <- function(pattern, replacement, x){

  j <- 1

  while( j < length(x) ){
    if(grepl(pattern, x[j+1]) ){
      j <- j+2 
    } else {
      x <- c( x[1:j], replacement, x[(j+1):length(x)] …
Run Code Online (Sandbox Code Playgroud)

regex r vector pattern-matching

5
推荐指数
1
解决办法
73
查看次数

日期向量的分位数函数

我注意到基本的R quantile函数不支持日期参数。

我赞赏为日期定义分位数需要在定义中加以注意(即,如果您有6个日期并要求第25个百分位数,则需要定义合适的舍入)。

是否有这种分位数功能的有效实现,可以作为基础或其他程序包的一部分。

以下示例函数实质上实现了我感兴趣的功能(通过一些调整来处理第0个百分位数的情况),但是我认为可以实现更有效的实现。

#Date quantile function.
dquantile <- function(x, probs){

  sx <- sort(x)

  pos <- round( probs * length(x) )

  return( sx[pos] )
}

# Example.
dates <- as.Date("01/01/1900", "%d/%m/%Y") + floor( 36500 * runif(100000) )

dquantile(dates, c(0.001, 0.025, 0.975, 0.999) )
Run Code Online (Sandbox Code Playgroud)

sorting r date

2
推荐指数
2
解决办法
657
查看次数

标签 统计

r ×3

date ×1

pattern-matching ×1

regex ×1

sorting ×1

vector ×1