用于bigz数据的R diff()函数?

时间:2016-08-10 16:13:36

标签: r

我想获得数据帧中连续行之间的差异,这是内置的diff()函数所做的。但是我的数据是bigz类(gmp包),所以我不能使用现有的函数。

class(MyData$IntIndex)
[1] "bigz"
diff(MyData$IntIndex)
Error in r[i1] - r[-length(r):-(length(r) - lag + 1L)] :
  non-numeric argument to binary operator

也许有一个包含功能的包可以解决我的问题?或者其他我能做的事情?

1 个答案:

答案 0 :(得分:1)

由于diff是S3通用的,并且非常简单易用,因此您可以动态添加自己的diff.bigz方法。以下是lag = 1differences = 1的默认案例的一个非常基本的示例:

library(gmp)

z <- as.bigz(
    c("1000000000000000000000000000",
      "1000000000000000000000000010",
      "1000000000000000000000000021",
      "1000000000000000000000000033",
      "1000000000000000000000000047")
)

diff.bigz <- function(x) {
    x[-1] - x[-length(x)]
}

diff(z)
#Big Integer ('bigz') object of length 4:
#[1] 10 11 12 14 

如果您想要更精细的内容,翻译diff.default应该不会太困难:

diff.default
# function (x, lag = 1L, differences = 1L, ...) 
# {
#     ismat <- is.matrix(x)
#     xlen <- if (ismat) 
#         dim(x)[1L]
#     else length(x)
#     if (length(lag) != 1L || length(differences) > 1L || lag < 
#         1L || differences < 1L) 
#         stop("'lag' and 'differences' must be integers >= 1")
#     if (lag * differences >= xlen) 
#         return(x[0L])
#     r <- unclass(x)
#     i1 <- -seq_len(lag)
#     if (ismat) 
#         for (i in seq_len(differences)) r <- r[i1, , drop = FALSE] - 
#             r[-nrow(r):-(nrow(r) - lag + 1L), , drop = FALSE]
#     else for (i in seq_len(differences)) r <- r[i1] - r[-length(r):-(length(r) - 
#         lag + 1L)]
#     class(r) <- oldClass(x)
#     r
# }
# <bytecode: 0x62f5c78>
# <environment: namespace:base>