我正在研究一个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
我该怎么做?
答案 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
plyr
和reshape2
软件包在这里运行良好,我认为代码特别清晰。具体来说,我将使用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
我得到了输出。