2017-09-18 14 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)이 열의 각각에 대해 각 열의 로그를 계산 한 다음 두 개의 인접한 행 사이의 차이를 계산합니다. 3) 완료되면 df2

df2 <- as.data.frame(sapply(df[2:22], function(x) diff(log(x)))) 
이라는 data.frame으로 변환하십시오.