1

私は、data.frame年間の株の配当で構成されるRに取り組んでいます(列に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

どうやってやるの?

4

2 に答える 2

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() 関数を使用して、年の一意のベクトルを取得します。それらは既に順序付けされています (データ フレームを順序付けする利点の 1 つ)。

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 の代わりに実際のデータを取得できるように、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

そして、私が得る出力があります。

于 2012-06-25T16:30:36.503 に答える