すべての行にユーザー ID に対応するdataframe
値があり、複数の行が同じ uid を持つことができます。各 uiduid
の行のランダム サンプルのみを含む新しいデータフレームを作成したいと考えています。x
私はこの関数を書きました:
trim <- function(df, max){
data.by.user <- split(df, df$uid) #split the dataframe by user
output <- NULL
lapply(data.by.user, function(x){
#length(x$tid) = number of rows for that user
if(is.null(output){
if(length(x$tid) <= max){
output <<- x
}
}else{
output <<- x[sample(nrow(x), size = max),]
}
}else if (length(x$tid) <= max){
output <<- rbind(output, x)
}else{
output <<- rbind(output, x[sample(nrow(x), size=max),]) #sample 'max' rows from x
}
})
return(output)
}
しかし、データフレーム (数百万行) で試してみると、
d <- trim(old_df, 200)
メモリが不足し、メモリの合計割り当てに達したという警告とともにこのエラーが発生します。
Error: cannot allocate vector of size 442 Kb
これを達成するためのよりメモリ効率の良い方法はありますか?