我有一个包含大量符号,日期和值的数据框
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来说,这似乎是一项完美的任务,但我正努力让某些事情发挥作用。任何建议将非常感谢。感谢您的时间和帮助。
答案 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
已按问题排序symbol
和date
,f
计算最后两个值的变化其向量参数和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)))