如何通过R数据帧中的百分位数来计算数据

时间:2014-01-07 22:53:52

标签: r dataframe binning

我有一个包含大量符号,日期和值的数据框

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来说,这似乎是一项完美的任务,但我正努力让某些事情发挥作用。任何建议将非常感谢。感谢您的时间和帮助。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

假设data.frame DF已按问题排序symboldatef计算最后两个值的变化其向量参数和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

答案 2 :(得分: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。可以使用基于factor函数的黑客生成分档。

mutate(df2, bin = as.integer(factor(-pctchg)))