誰かが次のコードと最小限の例を見て、特に非常に大きなデータセットを扱うときのコードの効率に関して改善を提案できるかどうか疑問に思います。
この関数は data.frame を受け取り、それをグループ化変数 (係数) で分割してから、各グループのすべての行の距離行列を計算します。
距離行列を保持する必要はありません-いくつかの統計、つまり平均、ヒストグラムのみ..、それらは破棄できます。
私はメモリ割り当てなどについてあまり知りません。グループごとに 10.000 ~ 100.000 のケースで作業するので、これを行うための最良の方法は何か疑問に思っています。どんな考えでも大歓迎です!
また、重大なメモリの問題が発生した場合のように、ビッグメモリまたはその他の大規模なデータ処理パッケージを関数に含める最も簡単な方法は何ですか?
FactorDistances <- function(df) {
# df is the data frame where the first column is the grouping variable.
# find names and number of groups in df (in the example there are three:(2,3,4)
factor.names <- unique(df[1])
n.factors <-length(unique(df$factor))
# split df by factor into list - each subset dataframe is one list element
df.l<-list()
for (f in 1:n.factors) {df.l[[f]]<-df[which(df$factor==factor.names[f,]),]}
# use lapply to go through list and calculate distance matrix for each group
# this results in a new list where each element is a distance matrix
distances <- lapply (df.l, function(x) dist(x[,2:length(x)], method="minkowski", p=2))
# again use lapply to get the mean distance for each group
means <- lapply (distances, mean)
rm(distances)
gc()
return(means)
}
df <- data.frame(cbind(factor=rep(2:4,2:4), rnorm(9), rnorm(9)))
FactorDistances(df)
# The result are three average euclidean distances between all pairs in each group
# If a group has only one member, the value is NaN
編集:回答として投稿したチャンクの問題を反映するようにタイトルを編集しました..