2017-09-18 10 views
0

私のデータフレームには、「DATE」、「INDEX」、S1、S2、S3 ... S20の22個の列が含まれています。 4322以上の行があります。私はログの戻り値を計算し、その結果をデータフレームに保存したい。それは私に4321行を与えるはずです。ログを計算するとデータフレームの列が返され、結果は新しいデータフレームに格納されます

私はこのコードを実行しますが、私は非常にエレガントな方法で簡単に計算を行うことができます。

# count the sum of rows in order to make the following formula work appropriately - (n-1) 
n <- nrow(df) 

# calculating the log returns (natural logarithm), of INDEX and S1-20 
LogRet_INDEX <- log(df$INDEX[2:n])-log(df$INDEX[1:(n-1)]) 
LogRet_S1 <- log(df$S1[2:n])-log(df$S1[1:(n-1)]) 
LogRet_S2 <- log(df$S2[2:n])-log(df$S2[1:(n-1)]) 
LogRet_S3 <- log(df$S3[2:n])-log(df$S3[1:(n-1)]) 
LogRet_S4 <- log(df$S4[2:n])-log(df$S4[1:(n-1)]) 
LogRet_S5 <- log(df$S5[2:n])-log(df$S5[1:(n-1)]) 
LogRet_S6 <- log(df$S6[2:n])-log(df$S6[1:(n-1)]) 
LogRet_S7 <- log(df$S7[2:n])-log(df$S7[1:(n-1)]) 
LogRet_S8 <- log(df$S8[2:n])-log(df$S7[1:(n-1)]) 
LogRet_S9 <- log(df$S9[2:n])-log(df$S8[1:(n-1)]) 
LogRet_S10 <- log(df$S10[2:n])-log(df$S10[1:(n-1)]) 
LogRet_S11 <- log(df$S11[2:n])-log(df$S11[1:(n-1)]) 
LogRet_S12 <- log(df$S12[2:n])-log(df$S12[1:(n-1)]) 
LogRet_S13 <- log(df$S13[2:n])-log(df$S13[1:(n-1)]) 
LogRet_S14 <- log(df$S14[2:n])-log(df$S14[1:(n-1)]) 
LogRet_S15 <- log(df$S15[2:n])-log(df$S15[1:(n-1)]) 
LogRet_S16 <- log(df$S16[2:n])-log(df$S16[1:(n-1)]) 
LogRet_S17 <- log(df$S17[2:n])-log(df$S17[1:(n-1)]) 
LogRet_S18 <- log(df$S18[2:n])-log(df$S18[1:(n-1)]) 
LogRet_S19 <- log(df$S19[2:n])-log(df$S19[1:(n-1)]) 
LogRet_S20 <- log(df$S20[2:n])-log(df$S20[1:(n-1)]) 

# adding the results from the previous calculation (log returns) to a data frame 
LogRet_df <- data.frame(LogRet_INDEX, LogRet_S1, LogRet_S2, LogRet_S3, LogRet_S4, LogRet_S5, LogRet_S6, LogRet_S7, LogRet_S8, LogRet_S9, LogRet_S10, LogRet_S11, LogRet_S12, LogRet_S13, LogRet_S14, LogRet_S15, LogRet_S16, LogRet_S17, LogRet_S18, LogRet_S19, LogRet_S20) 

このコードを短縮する可能性はありますか?たぶんループのいくつかの種類やforの引数を使用して?私はRにはかなり新しいので、知識を向上させようとしています。

どのようなヘルプも高く評価されています。

答えて

1

sapplyを使用すると、data.frameの各列に関数を適用できます。

以下のコードは、1)dfというデータフレームから2〜22の列を取ります。 2)この列のそれぞれについて、それぞれの列の対数を計算し、次に、2つの隣接する行の間の差を計算する。 3)完了したら、df2

df2 <- as.data.frame(sapply(df[2:22], function(x) diff(log(x)))) 
と呼ばれる data.frameに変換します。
関連する問題