因此,假设你的数据是,就像你贴叫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")
就像你做了,你可以从你的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
称为cast
格式化你的数据“宽”:
> 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
>
你有什么试过?看起来你的日期是'row.names'?你可以使用'dput'发布实际数据的一个子集。它会让你更容易给你一个正确的答案。 – Justin
这里是我所尝试过的,但它并没有提供我股票的股息,因为我只有日期:年份<-as.POSIXlt(日期)$ year + 1900 Div [,1] [which(years == 2000)] – marino89
对不起,Div是包含我所有数据的data.frame – marino89