R按日期对数据帧进行排序

R按日期对数据帧进行排序,r,dataframe,time-series,finance,stockquotes,R,Dataframe,Time Series,Finance,Stockquotes,我正在制作一个Rdata.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

我正在制作一个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

我该怎么做呢?

那么,假设您的数据位于类似您上面发布的名为
div
的data.frame中:

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")
plyr
restrape2
包在这里工作得很好,我认为代码特别清晰。具体地说,我将使用
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
> 

我认为使用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"))

这就是我得到的输出。

您尝试了什么?看起来您的日期是
行。名称是
?您可以使用
dput
发布实际数据的子集吗。这将使给你一个正确的答案变得更容易。这是我尝试过的,但它没有给我提供股票红利,因为我只得到了日期:yearssorry,Div是data.frame,它包含了我所有的数据。这个函数不起作用:distributions.sum@user1474263如果你使用我提供的数据,它会起作用。如果您使用函数
dput
为我们提供代码的可复制副本,那么我可以进一步提供帮助。错误表明您正在尝试计算字符向量的和,这当然是不可能的。但是,如果不以可用格式查看您的一些数据,我无法帮助调试。
> dcast(div.sum, years ~ variable, value.var='dividend')
  years barc.ln barn.se bas.gy bats.ln
1  1999    0.49    0.84   0.35       0
2  2000    0.00    0.00   0.40       0
3  2001    0.85    0.00   0.15       0
> 
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))
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]
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