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 集。变化,下一个是第二大的,依此类推。每个组需要具有大致相同数量的符号。

理想情况下,我希望我的新数据框看起来像这样

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.frame, DF, 已经按问题排序,symbol并且date在问题中,f计算其向量参数的最后两个值的变化并将其ave应用于每个组。最后我们使用orderto 重新排序并追加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

改编自 LukeA 的答案,作为更规范的plyr解决方案。

如果要使用plyr,请调用arrange而不是order.

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.bins 可以使用基于factor函数的 hack 生成。

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