大きなデータフレームalldata
があります。以前は古いバージョンで行われていたベースRで書かれたいくつかの計算をしようとしています。私の目標は新しい列を作成することですこれらの計算の出力はdplyrを使用して計算されます。以前のバージョンのこのコードでは、数十の中間データフレームを使用し、これらの計算を関数を使用して別々のファイルに書き出しました。マトリックス関数をdplyr突然変異体に埋め込む
これらの関数を書かれているとおりに保存することは可能ですが、元のバージョンの一時的な行列ではなく、alldata
のdplyr参照列に埋め込むことができるのは興味深いです。
ここに私が取り組んでいるコードのサンプルセクションがあります。コメントでわかるように、私は単純な加重平均関数のために古いRコードをdplyrに変換しました。機能がwgtmean
よりも複雑になりますよう
d_weighted = alldata %>%
# equivalent to by = list(regspp = data$regspp[inds]) from old code
group_by(regspp, year) %>%
# equivalent to wgtmean = function(x, na.rm=FALSE) wtd.mean(x=x[,1], weights=x[,2], na.rm=na.rm) from old code
mutate(lat_wgtmean = wtd.mean(x=lat, weights=wtcpue, na.rm=FALSE))
しかし、私はあるとしてだけ機能が含まれるようにしたいと思います。
古いコードから次の関数は、最初の列は値から成るマトリックスと重みの第二の加重標準偏差を計算する
wgtsd = function(mat, ...){
x = mat[,1][mat[,2]>0] # trim to values with weight > 0
w = mat[,2][mat[,2]>0]
sqrt(wtd.var(x=x, weights=w, ...))
}
はdplyrでこの機能を埋め込むことが可能である::加重標準偏差を含む新しい列をalldata
に作成するために、値= lat
(緯度)および重み= wtcpue
(単位努力当たりキャッチ、重みに変換)で変更しますか?
私はこれらの関数を書き直すことができると認識していますが、後でもっと複雑なもの(例として下のものを参照してください)にはそうしたくないと思います。関数を行列引数とdplyrで統合する。
wgtskew = function(mat, na.rm=FALSE){
x = mat[,1][mat[,2]>0] # trim to values with weight > 0
w = mat[,2][mat[,2]>0]
if(na.rm){
s = !is.na(x+w)
x = x[s]
w = w[s]
}
n = length(x)
w = n * w/sum(w) # normalize
if(n>2){
c3 = n/((n - 1) * (n - 2))
sdv = wgtsd(cbind(x, w), normwt = TRUE, na.rm = na.rm)
xbar = wtd.mean(x, w, na.rm = na.rm)
sk = c3 * sum(w^(3/2) * ((x - xbar)/sdv)^3)
return(sk)
} else {
return(NA)
}
}
代替機能は受け入れられる回答ですか?独自の加重標準偏差関数の自作はおそらく素晴らしい考えではないようです。 – Hugh
確かに!しかし、私はRの統計関数に慣れていないので、これらの(確かに自家製の)数学関数と同じ正確な数学的出力を明確に達成する関数を見つける方法はわかりません。 – AFH