我写了一个(可能不是特别好!)函数来测试一个数字是否是整数:
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)中尝试了这个并重复了这个问题.我有兴趣知道:
我有一个矢量
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) 我注意到基本的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)