2012-06-25 57 views
1

我正在研究一种R data.frame,它由每年的股票分割数组成(我有60个股票在列和通常的行日历)。当支付股息时,我已经得到这个数字,否则有一个NAR按日期排序数据框

基本上,这是我的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 

我该怎么做?

+1

你有什么试过?看起来你的日期是'row.names'?你可以使用'dput'发布实际数据的一个子集。它会让你更容易给你一个正确的答案。 – Justin

+0

这里是我所尝试过的,但它并没有提供我股票的股息,因为我只有日期:年份<-as.POSIXlt(日期)$ year + 1900 Div [,1] [which(years == 2000)] – marino89

+0

对不起,Div是包含我所有数据的data.frame – marino89

回答

2

因此,假设你的数据是,就像你贴叫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 

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称为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 
> 
+0

此函数不起作用:dividends.sum <-ddply(dividend.melt,。(years,variable),summarize,dividend = sum(值,na.rm =真))和错误消息是:eero总和(值,na.rm =真):'类型'(字符)不正确..... – marino89

+0

@ user1474263它的工作原理,如果你使用的数据我提供。如果你使用函数'dput'给我们一个可复制的代码副本,那么我可以进一步提供帮助。错误提示您正在尝试计算字符向量的总和,当然这是不可能的。但是,如果没有以可用格式查看一些数据,我无法帮助进行调试。 – Justin

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上标记,以便取代实际的数据。

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 

而且有我得到的输出。