この質問のフォローアップhere、例は具体的ですが、これは一般化可能なアプリケーションのように見えるので、別のスレッドの価値があると思います:
一般的な質問は次のとおりです。元のデータ フレームの値に対応するリストの要素を取得し、元のデータ フレームの値に従ってそれらを結合するには、特にリストの要素の長さが異なる場合はどうすればよいですか?
この例では、それぞれが日付でソートされた 2 つのグループを持つデータフレームがあります。私が最終的にやりたいことは、各セグメントに関連するメトリックだけを持つ、日付ごとに整理されたデータフレームを取得することです。特定のセグメントに特定の日付のデータがない場合は、0 になります。
実際のデータは次のとおりです。
structure(list(date = structure(c(15706, 15707, 15708, 15709,
15710, 15706, 15707, 15708), class = "Date"), segment = structure(c(1L,
1L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("abc", "xyz"), class = "factor"),
a = c(76L, 92L, 96L, 76L, 80L, 91L, 54L, 62L), x = c(964L,
505L, 968L, 564L, 725L, 929L, 748L, 932L), k = c(27L, 47L,
36L, 40L, 33L, 46L, 30L, 36L), value = c(6872L, 5993L, 5498L,
5287L, 6835L, 6622L, 5736L, 7218L)), .Names = c("date", "segment",
"a", "x", "k", "value"), row.names = c(NA, -8L), class = "data.frame")
したがって、「abc」セグメントについては、ベンチマークの 75 に対して (value/a) だけを気にします。「xyz」セグメントについては、ベンチマークの 0.04 に対して (k/x) だけを気にします。
最終的には、次のようなデータフレームが必要です。
date abc xyz
1 2013-01-01 0.21 0.24
2 2013-01-02 -0.13 0.00
3 2013-01-03 -0.24 -0.03
4 2013-01-04 -0.07 0.00
5 2013-01-05 0.14 0.00
ここで、「xyz」には 2013 年 1 月 1 日から 2013 年 1 月 3 日までの情報しかないため、それ以降はすべて 0 になります。
私がこの点に到達した方法は次のとおりです。
mapplyに渡す引数を定義する
splits <- split(test, test$segment)
metrics <- c("ametric","xmetric")
benchmarks <- c(75,0.04)
ベンチマークに対するパフォーマンスを取得する関数
performance <- function(splits,metrics,benchmarks){
(splits[,metrics]/benchmarks)-1
}
これらを mapply に渡します。
temp <- mapply(performance, splits, metrics, benchmarks)
問題は、分割の長さが異なるため、出力が次のようになることです。
summary(temp)
Length Class Mode
abc 5 -none- numeric
xyz 3 -none- numeric
各分割の元のデータ フレームから日付を取り込み、それらの日付に従って (データがない場合は 0 で) 結合する方法はありますか?