R 计算数据帧+;将结果存储在新的数据框中

R 计算数据帧+;将结果存储在新的数据框中,r,loops,for-loop,simplify,R,Loops,For Loop,Simplify,我的数据框包含22列:“日期”、“索引”和S1、S2、S3。。。S20。共有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 (na

我的数据框包含22列:“日期”、“索引”和S1、S2、S3。。。S20。共有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)
#计算行的总和,以使以下公式正确工作-(n-1)

n您可以使用
sapply
将函数应用于data.frame的每一列

下面的代码所做的是1)从名为
df
的数据框中获取第2列到第22列。2) 对于每一列,计算相应列的对数,然后计算两个相邻行之间的差值。3) 完成后,将其转换为
data.frame
调用的
df2

df2 <- as.data.frame(sapply(df[2:22], function(x) diff(log(x))))
df2