R 向数据框添加列以计算日志返回
我有一个包含时间序列财务数据的数据框,我想计算每个数据框的日志回报 下面是一个简化的示例(实际上,我有上百列):R 向数据框添加列以计算日志返回,r,R,我有一个包含时间序列财务数据的数据框,我想计算每个数据框的日志回报 下面是一个简化的示例(实际上,我有上百列): df您可以使用plyr::colwise calc_log_return <- function(x) diff(log(x), lag = 1) logReturns <- plyr::colwise(calc_log_return)(DF[, -1]) calc\u log\u return您可以使用plyr::colwise calc_log_return <
df您可以使用plyr::colwise
calc_log_return <- function(x) diff(log(x), lag = 1)
logReturns <- plyr::colwise(calc_log_return)(DF[, -1])
calc\u log\u return您可以使用plyr::colwise
calc_log_return <- function(x) diff(log(x), lag = 1)
logReturns <- plyr::colwise(calc_log_return)(DF[, -1])
calc\u log\u returnSimplefor
loop应该完成以下工作:
df2 <- df[,1:2]
for(name in names(df)[2:length(names(df))]){
df2[,name] <- df[,name]
df2[2:nrow(df2),paste0(name, ".Log")] <- diff(log(as.numeric(as.character(df[,name]))), lag = 1)
}
head(df2)
df2Simplefor
loop应该完成以下工作:
df2 <- df[,1:2]
for(name in names(df)[2:length(names(df))]){
df2[,name] <- df[,name]
df2[2:nrow(df2),paste0(name, ".Log")] <- diff(log(as.numeric(as.character(df[,name]))), lag = 1)
}
head(df2)
df2我们可以从dplyr
library(dplyr)
df %>% mutate_each(funs(round(c(NA, diff(log(as.numeric(as.character(.))))),3)),
B126:H251)
# Date B126 H251
#1 2004/10/29 NA NA
#2 2004/11/30 0.015 0.058
#3 2004/12/31 0.003 -0.012
#4 2005/0131 0.024 -0.001
我们可以从dplyr
library(dplyr)
df %>% mutate_each(funs(round(c(NA, diff(log(as.numeric(as.character(.))))),3)),
B126:H251)
# Date B126 H251
#1 2004/10/29 NA NA
#2 2004/11/30 0.015 0.058
#3 2004/12/31 0.003 -0.012
#4 2005/0131 0.024 -0.001
另一个dplyr解决方案。应用mutate_each后,使用merge from base R将新列添加到原始数据中
library(dplyr)
# clean up data (convert strings to numbers)
df <- df %>% mutate_each(funs(as.numeric(as.character(.))), B126:H251)
# calculate log diff and merge
df %>% merge(df %>% mutate_each(funs(c(NA,diff(log(.)))), B126:H251), by='Date', suffixes=c('','_log'))
# optionally apply rounding function
df %>% mutate_each(funs(round(.,3)), B126_log:H251_log)
另一个dplyr解决方案。应用mutate_each后,使用merge from base R将新列添加到原始数据中
library(dplyr)
# clean up data (convert strings to numbers)
df <- df %>% mutate_each(funs(as.numeric(as.character(.))), B126:H251)
# calculate log diff and merge
df %>% merge(df %>% mutate_each(funs(c(NA,diff(log(.)))), B126:H251), by='Date', suffixes=c('','_log'))
# optionally apply rounding function
df %>% mutate_each(funs(round(.,3)), B126_log:H251_log)
是否正在尝试记录df$B126中的每个值?为什么第一行是空的?例如@Nathan Day Log“0.0152”=Log(104.821/103.238)。基本上,这是11/2004的日志返回,这就是为什么我希望第一行为空。您是否尝试在df$B126中记录每个值?为什么第一行是空的?例如@Nathan Day Log“0.0152”=Log(104.821/103.238)。基本上这是2004年11月的日志返回,这就是为什么我希望第一行是空的。谢谢!但是我在运行logReturns后得到了这个错误消息error in Math.factor(x):“log”对factors没有意义logReturns您检查过所有列都是数字吗?使用str
。只需要一列中包含一些文本就可以搞乱upI,因为我正在对示例数据运行代码str(df)
返回'data.frame':4个obs。在3个变量中,
是导致问题的日期列吗?否-DF[,-1]删除日期列。问题在于示例数据中的引号。它们强制列成为字符向量,然后自动转换为因子。删除这些,一切都会好起来。我对R很陌生。你能更具体地介绍一下“引号”以及如何删除它们吗?我感谢你的帮助!非常感谢。但是我在运行logReturns后得到了这个错误消息error in Math.factor(x):“log”对factors没有意义logReturns您检查过所有列都是数字吗?使用str
。只需要一列中包含一些文本就可以搞乱upI,因为我正在对示例数据运行代码str(df)
返回'data.frame':4个obs。在3个变量中,
是导致问题的日期列吗?否-DF[,-1]删除日期列。问题在于示例数据中的引号。它们强制列成为字符向量,然后自动转换为因子。删除这些,一切都会好起来。我对R很陌生。你能更具体地介绍一下“引号”以及如何删除它们吗?我感谢你的帮助!