首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中用自己的函数填充向量

如何在R中用自己的函数填充向量
EN

Stack Overflow用户
提问于 2019-07-29 17:15:41
回答 2查看 40关注 0票数 0

我有一个包含一些信息的向量,我需要创建一个包含日志变化的新向量,而不需要使用循环来提高性能,我的数据如下所示:

代码语言:javascript
复制
Var1
12
34
23
56
9
10

我已经在尝试使用了

代码语言:javascript
复制
sapply(Var1, function(i) {
  log(Var[i]/Var[i-1])
})

但这对我没用,我想要这样的东西

代码语言:javascript
复制
Var1     New_VaR2
12  NA
34  1.041453875
23  -0.390866309
59  0.942043228
9   -1.880312867
10  0.105360516

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-29 17:27:37

I更喜欢项目1中的解决方案,但在项目2中提供了对代码的更正,以供参考。(请使用1. :-)

  1. 在默认情况下,R的许多函数是向量化的,这意味着它们很高兴地工作在1值、2值或2百万值上。这样做的一个好处是,您不需要显式地尝试循环或迭代,这样代码就更简单了。另一个好处是,当一个函数被本机向量化时,它通常(但并不总是)比手动迭代快得多。 x$Var2 <- c( NA,log(x$Var1-1 /x$ Var1 -nrow(X)x#Var1 Var2 #1 12 NA#2 34 34#3 23 -0.3908663 #4 56 0.8898575 #5 9 -1.8281271 #6 10 0.1053605
  2. 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

数据:

代码语言:javascript
复制
x <- structure(list(Var1 = c(12L, 34L, 23L, 56L, 9L, 10L)), class = "data.frame", row.names = c(NA, 
-6L))
票数 1
EN

Stack Overflow用户

发布于 2019-07-29 17:31:35

我相信在R中最直接的方法是使用dplyr::lag

代码语言:javascript
复制
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

数据.

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57258573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档