R按日期排序数据框

时间:2012-06-25 13:41:42

标签: r dataframe time-series finance stockquotes

我正在研究一个R data.frame,每年由股票股票组成(我在列中有60个股票和行中的通常日历)。支付股息后,我得到了数字,否则有NA

基本上,这就是我的Data.frame的样子

           BARC LN      BARN SE  BAS GY  BATS LN 
1999-01-01      0.26       NA      NA
1999-01-02       NA       0.56     0.35     NA
1999-01-03       NA        NA      NA       NA
2000-01-04       NA        NA      0.40     NA
1999-01-05      0.23      0.28     NA       NA
2001-01-06       NA        NA      NA       NA
2001-01-07      0.85       NA     0.15      NA

我想获得每股股票每年支付的股息金额,以计算股息收益率,最后得到一个数据;框架如下:

           BARC LN   BARN SE  BAS GY  BATS LN 
   1999       NA        NA      NA       NA
   2000       NA        NA      NA       NA
   2001       NA        NA      NA       NA

我该怎么做?

2 个答案:

答案 0 :(得分:2)

因此,假设您的数据位于您上面发布的数据框架中,名为div

div <- structure(list(barc.ln = c(0.26, NA, NA, NA, 0.23, NA, 0.85), 
    barn.se = c(NA, 0.56, NA, NA, 0.28, NA, NA), bas.gy = c(NA, 
    0.35, NA, 0.4, NA, NA, 0.15), bats.ln = c(NA, NA, NA, NA, 
    NA, NA, NA)), .Names = c("barc.ln", "barn.se", "bas.gy", 
"bats.ln"), row.names = c("1999-01-01", "1999-01-02", "1999-01-03", 
"2000-01-04", "1999-01-05", "2001-01-06", "2001-01-07"), class = "data.frame")

正如您所做的那样,您可以从row.names

中提取年份
div$years <- as.POSIXlt(row.names(div))$year + 1900

plyrreshape2软件包在这里运行良好,我认为代码特别清晰。具体来说,我将使用melt将数据设为长,然后ddply分成若干组并sum分红:

library(plyr)
library(reshape2)
div.melt <- melt(div, id.vars='years')
div.sum <- ddply(div.melt, 
                 .(years, variable), 
                 summarise, 
                 dividend = sum(value, na.rm=TRUE))

> div.sum
 years variable dividend
1   1999  barc.ln     0.49
2   1999  barn.se     0.84
3   1999   bas.gy     0.35
4   1999  bats.ln     0.00
5   2000  barc.ln     0.00
6   2000  barn.se     0.00
7   2000   bas.gy     0.40
8   2000  bats.ln     0.00
9   2001  barc.ln     0.85
10  2001  barn.se     0.00
11  2001   bas.gy     0.15
12  2001  bats.ln     0.00
> 

然后,您可以使用名为reshape2的{​​{1}}中的其他功能来“宽广”地格式化您的数据:

cast

答案 1 :(得分:1)

我认为你可以使用by()很容易地做到这一点。这就是我做到的。我已经把每个块放在每个块下面。

dividends <- data.frame(barc_ln=c(0.26,NA,NA,NA,0.23,NA,0.85),
                        barn_se=c(NA,0.56,NA,NA,0.28,NA,NA),
                        bas_gy=c(NA,0.35,NA,0.40,NA,NA,0.15),
                        bats_ln=c(NA,NA,NA,NA,NA,NA,NA),
                        row.names=c("1999-01-01","1999-01-02","1999-01-03","2000-01-04","1999-01-05","2001-01-06","2001-01-07"))

这只会创建您提供的原始数据框。

dividends[,"dates"] <- as.Date(row.names(dividends))
dividends <- dividends[order(dividends[,"dates"]),]
dividends[,"year"] <- format(dividends$dates,"%Y")

这将获取行名称日期,然后将它们转换为数据框中的新列(“日期”)。然后,我们按日期订购数据框(不一定是必需的,但我发现它更直观)并使用格式提取年份(作为角色,请注意)。

div_output <- data.frame(row.names=unique(dividends$year))

接下来,我创建将接收数据的输出数据帧。我使用year变量的unique()函数来获得年份的唯一向量。它们已被订购(订购数据框的一个优点)。

for(x in 1:4) {
    div_output[,x] <- by(dividends[,x],INDICES=dividends$year,FUN=sum,na.rm=TRUE)
}
names(div_output) <- names(dividends)[1:4]

使用一个简单的循环,我们只需浏览每一列并应用by()函数。变量是列,索引是年份,我们只使用sum函数。我在na.rm = TRUE上进行标记,这样您就可以获得实际数据而不是NA。

print(div_output)

     barc_ln barn_se bas_gy bats_ln
1999    0.49    0.84   0.35       0
2000    0.00    0.00   0.40       0
2001    0.85    0.00   0.15       0

我得到了输出。