1

本当に大きな data.frame で diff 関数を使用したいと思います: 1 億 4000 万行と 2 列。

目標は、user_id ごとに、2 つの連続する日付アクティビティ間のギャップを計算することです。ユーザーごとに、最初のアクティビティには前のアクティビティがないため、NA 値が必要です。

私はこの関数を使用しましたが、小さなデータセットでは機能しますが、大きなデータセットでは非常に遅くなります。昨日から待っていますが、まだ実行中です。

df2 <- as.vector(unlist(tapply(df$DATE,df$user_id, FUN=function(x){ return (c(NA,diff(x)))})))

大量のメモリ (24GO) と 4 コアの CPU がありますが、1 つしか機能していません。

この問題を管理するにはどうすればよいでしょうか。データフレームをマトリックスに変換した方が良いですか?

4

2 に答える 2

2

すべてを一緒に回避すると、これははるかに高速になります。これは、データがおよびによって既にソートされていることを呼び出しが前提としているtapplyため、かなり簡単です。tapplyuser_idDATE

set.seed(21)
N <- 1e6
Data <- data.frame(DATE=Sys.Date()-sample(365,N,TRUE),
                   USER=sample(1e3,N,TRUE))
Data <- Data[order(Data$USER,Data$DATE),]
system.time({
  Data$DIFF <- unlist(tapply(Data$DATE,Data$USER, function(x) c(NA,diff(x))))
})
#   user  system elapsed 
#   1.58    0.00    1.59
Data2 <- Data
system.time({
  Data2$DIFF <- c(NA,diff(Data2$DATE))
  is.na(Data2$DIFF) <- which(c(NA,diff(Data2$USER))==1)
})
#   user  system elapsed 
#   0.12    0.00    0.12
identical(Data,Data2)
# [1] TRUE
于 2013-05-03T14:19:07.457 に答える