「値」と「重み」という2つのデータフレームがあり、カテゴリ(A、B、C)ごとに重み付けされたメジアンを年単位で計算したいとします。weightedMedian(matrixStats)をカテゴリ順に計算する
values <- data.frame(TICKER=c("A","A","B","B","B","C","C","C","C"), year1=c(1,2,3,4,5,6,7,8,9), year2=c(9,8,7,6,5,4,3,2,1))
weights <- data.frame(TICKER=c("A","A","B","B","B","C","C","C","C"), year1=c(0.3,0.7,0.25,0.25,0.5,0.1,0.1,0.6,0.2), year2=c(0.6,0.4,0.3,0.5,0.2,0.4,0.2,0.1,0.3))
私はddplyとweightedMedian関数(package matrixStats)を使いたいと思っていました。
output <- ddply(values, .(TICKER), colwise(weightedMedian(values, weights), na.rm=TRUE))
しかし、私はエラーメッセージを取得:
"(list) object cannot be coerced to type 'double'"
を誰もが機能するソリューションを取得するためにコードを調整する方法を知っていますか?
weightedMedianは行列を入力する必要があるため、データフレームを(as.matrixを介して)行列に変換しようとしました。しかし、これは役に立たない。 私がこれまでに見つかった唯一の解決策は、サブセットを使用してループである(ただし、これは非常にエレガントな、非常に遅いとではありません)
output <- matrix(data=0, nrow=3, ncol=2)
for (i in 2:ncol(values)){
for (j in 1:length(unique(values$TICKER))){
values.j <- subset(values, values$TICKER == as.character(unique(values$TICKER)[j]))
weights.j <- subset(weights, weights$TICKER == as.character(unique(values$TICKER)[j]))
output[j,(i-1)] <- weightedMedian(values.j[,i], weights.j[,i], na.rm=TRUE)
}}
任意の助けいただければ幸いです。どうもありがとう。
こんにちは、実際のデータにはca.が含まれています。 70期間(coloumns)および約ca. 15,000カテゴリ – Marcel