以下のコードでは、plyr または data.table を使用して med.val2 をエレガントに計算する方法について誰かが洞察を持っているかどうか疑問に思っていました。
library(plyr)
設定例データ
data <- data.frame(id1 = 1:20, id2 = rep(letters[1:4], 5), vals=rnorm(20))
最初にグループの中央値をループで計算します
data$med.val <- rep(0, 20)
for (ind in 1:20) data$med.val[ind] <- median(data$vals[data$id2==data$id2[ind]])
現在、プライアを使用しています
data <- ddply(data, .(id2), mutate, med.val.plyr=median(vals))
等しいはずです
all.equal(data$med.val, data$med.val.plyr)
重要な行を除く、同じ id2 を持つ行の中央値
# Median of values corresponding to
# data$id1!=data$id1[ind] & data$id2==data$id2[ind]
data$med.val2 <- rep(0, 20)
for (ind in 1:20) data$med.val2[ind] <- median(data$vals[data$id1!=data$id1[ind] & data$id2==data$id2[ind]])
R では、通常、グループごとに値を効率的に計算するために plyr または data.table を使用します。私の実際のデータと関数はより複雑ですが、構造は同じです。焦点行を除いて、共通の識別子を持つ行のデータを使用して関数を計算する必要があります。そして、それを効率的かつエレガントに行う方法がわかりません。