R按日期对数据帧进行排序
我正在制作一个RR按日期对数据帧进行排序,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
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