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 returnSimple
for
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)

df2Simple
for
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很陌生。你能更具体地介绍一下“引号”以及如何删除它们吗?我感谢你的帮助!