2017-11-15 7 views
1

私は車両用のETAを含むデータフレームを持っています。データには1つの(実際の)到着のETAが多数含まれており、1つの到着に対応する必要があるETAをグループ化したいと考えています。私はこのクラスタリングを行い、カスタム関数を書いたグループ化されたデータフレームでクラスタリング機能をループすることができますか?

vehicle  eta  ... cluster 
--------- ------------ ----- --------- 
    car_1  01-11-2017 ...   1 
    car_1  02-11-2017 ...   1 
    car_1  15-11-2017 ...   2 
    horse_3 05-11-2017 ...   1 
    horse_3 12-11-2017 ...   2 
    horse_3 13-11-2017 ...   2 

私のデータは私の望ましい結果としてclusterで、次のようになります。関数の入力は1台の車両の行で、クラスタインデックスの配列を返します。たとえば、私のサンプルデータの行1~3を渡すと、c(1,1,2)が出力されます。だから、私がする必要があるのは、データセット内のすべての車両をサイクルして機能を適用することだけです。しかし、それは私が立ち往生しているところです。

私のカスタムクラスタリング機能として cluster_etas

、私はこれを行うことができます知っている:

# Initialize an empty column 
data$cluster <- 0 

# Loop over all vehicles and perform clustering 
for (i in unique(data$vehicle)) { 
    filter_vector <- data$vehicle == i 
    data$cluster[filter_vector] <- cluster_etas(data[filter_vector,]) 
} 

しかし、私は、充填機能のapply -kindとこのようになり、よりスマートな解決策がある疑いがあります空白:

data$cluster <- _____(data = data, by = vehicle, function = cluster_etas) 

この種の操作を実行する機能はありますか?それはどうなりますか?

+0

私には「tapply」のように見えます。 – lmo

+0

私が見る限り、 'tapply'は原子ベクトルだけを入力として受け取ります。実際には、行全体をクラスタリング関数に渡す必要があります。 –

+1

split + lapply?パッケージに公開されている場合は、dplyrのgroup_byまたはdata.tableです。もう一つのオプションは '?by'でしょう –

答えて

0

は、私は実用的なソリューションのためのを発見しました問題はplyrパッケージのddply機能を使用しています。私のカスタム関数を変更する必要がありました。以前は、カスタム関数が引数としてデータフレームを取り、必要な列を抽出しましたが、今度はそれらの列を引数として直接取るようになりました(とにかくより一般的な解決策になります)。

data <- plyr::ddply(data, "vehicle", transform, 
        cluster = cluster_etas(eta, travel_time, ...)) 
0

tapply
は引数Explaningベクトル

str(tapply) 
#function (X, INDEX, FUN = NULL, ..., simplify = TRUE) 

のサブセット上で関数を適用する - 古本:
Xをベクトル
INDEXは因子または要因のリスト(または何かの強制可能です因子に)
FUNは、適用される関数です。
には他の引数がありますしたがって、S渡されるFUN

、私は解決策が tapplyのようなものであるべきと考えている(データ$イータ、データ$車、FUN = ..your機能...)

+0

これは、カスタム関数が旅行時間のようなETAよりも多くのデータを必要とすることを除いて、動作します。したがって、1つの列だけでなく、入力として行全体が必要です。 –

+1

私は '適用'ファミリーはあなたが探しているツールではないと言います。より洗練されたソリューションは、 'dplyr'、特に 'data.table'によって提供されます。 残念ながら、私は後者の専門家ではないので、解決を待つようにしてください:) – Seymour

関連する問題