R:我如何填充数据框的行,其中每行代表一天,每年只有一个公共值?
我有一个数据框,包含日期列,价格列以及从这两列派生的各种其他列。其中一列计算了给定年份中每天的价格从该年初开始的百分比变化(这与之前的问题有关)。
我想添加一个列,该列在特定年份的每一天保存该年度整个价格的百分比变化。因此,如果价格从2009年的第一天到最后一天上涨10%,那么2009年所有日子的列应该保持10%(或0.1)的值。如果价格在2010年的第一天和最后一天之间下降了2%,那么2010年每天的列应保持-0.02等值。依此类推。
我到目前为止的代码是:
require(lubridate)
require(plyr)
# generate data
set.seed(12345)
df <- data.frame(date=seq(as.Date("2009/1/1"), by="day", length.out=1115),price=runif(1115, min=100, max=200))
# remove weekend days
df <- df[!(weekdays(as.Date(df$date)) %in% c('Saturday','Sunday')),]
# add some columns for later
df$year <- as.numeric(format(as.Date(df$date), format="%Y"))
df$month <- as.numeric(format(as.Date(df$date), format="%m"))
df$day <- as.numeric(format(as.Date(df$date), format="%d"))
df$daythisyear <- as.numeric(format(as.Date(df$date), format="%j"))
df <- transform(df, doy = as.Date(paste(2000, month, day, sep="/")))
df <- ddply(df, .(year), transform, pctchg = ((price/price[1])-1))
我意识到我可以通过使用另一个数据框来获得年度(同比)变化,如下所示:
df.yr <- ddply(df, .(year), function(x) (x[nrow(x),2]/x[1,2])-1)
...但我无法弄清楚如何将这些年份的数字添加到现有数据框中的列中,特别是考虑到(如果您使用4年的数据),只有4行,每年一个,相比之下,在用于推导这4行的每日数据的数据框架中大约有800个 - 你得到了不匹配。
直接从数据框的最后一行开始使用for循环并向上移动daythisyear列以实现此目的(如果当前行的daythisyear比下面的行上的daythisyear大,那么你有一个变化year,所以从该行中获取新值以在要添加的列中使用等)。尽管如此,我确信必须有一个使用apply函数或ddply的更多R-colloquial方法,到目前为止我已经刻意避免了解决问题。所以我的问题是:
Q值。如何计算列值的年度变化,然后将该值作为新列插入该年的每一行?
答案 0 :(得分:2)
我还没有转变为ddply用户,而是在明显的解决方案时使用ave
。我怀疑这段代码会翻译出来:
df$pctYrChng <- ave(df$price, df$year, FUN=function(x) tail(x,1)/head(x,1) - 1)
unique(df$pctYrChng)
#[1] -0.03259032 -0.05781901 0.35932519 0.04246669