2016-08-10 2 views
1

データフレーム内の連続する行の違いを取得したいのですが、これは組み込みのdiff()関数の機能です。しかし、私のデータはbigzクラス(gmpパッケージ)のものなので、既存の関数を使うことはできません。bigzデータのR diff()関数?

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

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>