ddplyを使用してデータをクリーンアップしようとしていますが、130万行で実行速度が非常に遅くなっています。
サンプルコード:
#Create Sample Data Frame
num_rows <- 10000
df <- data.frame(id=sample(1:20, num_rows, replace=T),
Consumption=sample(-20:20, num_rows, replace=T),
StartDate=as.Date(sample(15000:15020, num_rows, replace=T), origin = "1970-01-01"))
df$EndDate <- df$StartDate + 90
#df <- df[order(df$id, df$StartDate, df$Consumption),]
#Are values negative?
# Needed for subsetting in ddply rows with same positive and negative values
df$Neg <- ifelse(df$Consumption < 0, -1, 1)
df$Consumption <- abs(df$Consumption)
ある行の消費値が同じであるが、別の行の消費値とは負である行を削除する関数を作成しました(同じIDの場合)。
#Remove rows from a data frame where there is an equal but opposite consumption value
#Should ensure only one negative value is removed for each positive one.
clean_negatives <- function(x3){
copies <- abs(sum(x3$Neg))
sgn <- ifelse(sum(x3$Neg) <0, -1, 1)
x3 <- x3[0:copies,]
x3$Consumption <- sgn*x3$Consumption
x3$Neg <- NULL
x3}
次に、ddplyを使用してその関数を適用し、データ内のこれらの誤った行を削除します
ptm <- proc.time()
df_cleaned <- ddply(df, .(id,StartDate, EndDate, Consumption),
function(x){clean_negatives(x)})
proc.time() - ptm
data.tableを使用してこれを高速化できることを望んでいましたが、data.tableを使用して支援する方法を理解できませんでした。
130万行の場合、これまでのところ、デスクトップの計算に1日かかりますが、まだ完了していません。