我有一个包含一些信息的向量,我需要创建一个包含日志变化的新向量,而不需要使用循环来提高性能,我的数据如下所示:
Var1
12
34
23
56
9
10我已经在尝试使用了
sapply(Var1, function(i) {
log(Var[i]/Var[i-1])
})但这对我没用,我想要这样的东西
Var1 New_VaR2
12 NA
34 1.041453875
23 -0.390866309
59 0.942043228
9 -1.880312867
10 0.105360516提前谢谢。
发布于 2019-07-29 17:27:37
I更喜欢项目1中的解决方案,但在项目2中提供了对代码的更正,以供参考。(请使用1. :-)
sapply代码中,将Var1的每个值分配给i,但在内部将其作为索引处理。所以第一次尝试log时,i是12,但是Var1[i]不是你想要的,即使你的向量足够长,以至于它是正确的。为此,您应该迭代从2开始的序列,比如seq_along(Var1)[-1] (它总是比2:length(Var1)安全)。
x$Var3 <- c( NA,sapply(seq_along(x$ Var1 )-1,函数(I)log(x$var1i/x$var1i-1))x#Var1 Var2 Var3 #1 12 NA #2 34 1.0414539 1.0414539 #3 23 -0.3908663 -0.3908663 #4 0.8898575 0.8898575 #5 9 -1.8281271 1.8281271#6 0.1053605 0.1053605数据:
x <- structure(list(Var1 = c(12L, 34L, 23L, 56L, 9L, 10L)), class = "data.frame", row.names = c(NA,
-6L))发布于 2019-07-29 17:31:35
我相信在R中最直接的方法是使用dplyr::lag。
log(df1$Var1/dplyr::lag(df1$Var1))
#[1] NA 1.0414539 -0.3908663 0.9420432 -1.8803129 0.1053605
all.equal(df1$New_VaR2, log(df1$Var1/dplyr::lag(df1$Var1)))
#[1] TRUE数据.
df1 <- read.table(text = "
Var1 New_VaR2
12 NA
34 1.041453875
23 -0.390866309
59 0.942043228
9 -1.880312867
10 0.105360516
", header = TRUE)https://stackoverflow.com/questions/57258573
复制相似问题