0

多数のシンボル、日付、および値を含むデータ フレームがあります。

date         symbol value
2014-01-03     A      2.5
2014-01-04     A      3.1
2014-01-06     A      4.5
2014-01-03     B      2.6
2014-01-05     B      3.2
2014-01-06     B      4.3

データをシンボルで分割し、最新の 2 つの日付の変化率を計算し、最初のグループが最大の pct セットを持つ可変数のグループでデータをビンに入れたいと考えています。次は 2 番目に大きいなどです。各グループには、ほぼ同じ数のシンボルが必要です。

理想的には、新しいデータ フレームを次のようにしたい

date         symbol value       pctchg     bin
2014-01-03     A      2.5       .45161      1
2014-01-04     A      3.1       .45161      1
2014-01-06     A      4.5       .45161      1
2014-01-03     B      2.6       .34375      2
2014-01-05     B      3.2       .34375      2
2014-01-06     B      4.3       .34375      2

これは ddply にとって完璧なタスクのように思えますが、何かを機能させるのに苦労しています。どんな提案でも大歓迎です。お時間をいただき、ありがとうございました。

4

3 に答える 3

1

私は経験豊富なコーダーではありませんが、次の候補者を採用します。

df <- read.table(sep=" ", header=T, text="
date symbol value
2014-01-03 A 2.5
2014-01-04 A 3.1
2014-01-06 A 4.5
2014-01-03 B 2.6
2014-01-05 B 3.2
2014-01-06 B 4.3")

library(plyr)
df <- df[order(df$symbol, df$date),]
df <- ddply(df, "symbol", transform, pctchg=value[length(value)]/value[length(value)-1]-1)
df <- df[order(-df$pctchg),]

bins <- 2

library(ggplot2)
groups <- cut_number(1:length(unique(df$pctchg)), n=bins)
levels(groups) <- 1:length(levels(groups))
df <- merge(x=df, y=cbind.data.frame(symbol=unique(df$symbol), bin=groups))
df[order(-df$pctchg),]
#   symbol       date value    pctchg bin
# 1      A 2014-01-03   2.5 0.4516129   1
# 2      A 2014-01-04   3.1 0.4516129   1
# 3      A 2014-01-06   4.5 0.4516129   1
# 4      B 2014-01-03   2.6 0.3437500   2
# 5      B 2014-01-05   3.2 0.3437500   2
# 6      B 2014-01-06   4.3 0.3437500   2
于 2014-01-08T00:49:16.197 に答える
0

data.frameDFが既にソートされているsymbolと仮定するとdate、問題fのように、ベクトル引数の最後の 2 つの値の変化を計算し、aveそれを各グループに適用します。最後に、 を使用orderして再ソートし、追加しますbin。質問に示されている値はパーセントではないため、relchg代わりに見出しを使用しました。pctchg

f <- function(x) { n <- length(x); if (n > 1) x[n] / x[n-1] - 1 else NA }
DF2 <- transform(DF, relchg = ave(value, symbol, FUN = f))
o <- with(DF2, order(-relchg, symbol, date))
transform(DF2[o, ], bin = as.numeric(factor(symbol, levels = unique(symbol))))

結果は次のとおりです。

        date symbol value    relchg bin
1 2014-01-03      A   2.5 0.4516129   1
2 2014-01-04      A   3.1 0.4516129   1
3 2014-01-06      A   4.5 0.4516129   1
4 2014-01-03      B   2.6 0.3437500   2
5 2014-01-05      B   3.2 0.3437500   2
6 2014-01-06      B   4.3 0.3437500   2
于 2014-01-08T00:55:24.557 に答える
0

plyrより標準的なソリューションとして LukeA の回答から適応。

を使用する場合は、ではなくplyr呼び出してください。arrangeorder

df <- arrange(df, symbol, date)

のコードpctchgが正しくありません。質問の出力を一致させるには、使用します

df2 <- ddply(
  df,
  .(symbol), 
  mutate, 
  pctchg = (value[length(value)] - value[length(value)-1]) / value[length(value)-1]
)

(mutateではなくを使用していることにも注意してください。ビンは、関数transformに基づくハックを使用して生成できます。factor

mutate(df2, bin = as.integer(factor(-pctchg)))
于 2014-01-08T13:30:06.140 に答える