如何在R中用自己的函数填充向量
我有一个包含一些信息的向量,我需要创建一个包含日志变量的新向量,而不使用循环以获得更好的性能,我的数据如下所示:如何在R中用自己的函数填充向量,r,apply,R,Apply,我有一个包含一些信息的向量,我需要创建一个包含日志变量的新向量,而不使用循环以获得更好的性能,我的数据如下所示: Var1 12 34 23 56 9 10 我已经在尝试使用sapply了 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.8
Var1
12
34
23
56
9
10
我已经在尝试使用sapply了
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
提前感谢。我非常喜欢项目符号1中的解决方案,但项目符号2中提供了对代码的更正,供您参考。(请使用1.:-)
x$Var2I非常喜欢项目符号1中的解决方案,但是项目符号2中提供了对代码的更正,供您参考。(请使用1.:-)
默认情况下,R的许多函数都是矢量化的,这意味着它们可以处理1个值、2个值或200万个值。这样做的一个好处是,您不需要显式地尝试循环或迭代,因此代码更简单。另一个好处是,当一个函数本机矢量化时,它通常(但并非总是)比手动迭代快得多
x$Var2我认为在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)
df1我相信在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)
df1x$Var2供参考:使用sapply
代码,认识到i
是每个Var1
的值,但在内部,您将其视为该向量上的索引。您可能已经能够执行如下操作:sapply(seq_-along(x$Var1)[-1],function(i)log(x$Var1[i]/x$Var1[i-1])
,尽管出于前面答案中所述的原因,您需要预先编写一个NA
。(而且log
的矢量化使用要比sapply
或快得多。对于循环,尽可能/可用时使用矢量化函数。)谢谢你们,你们太棒了x$Var2供参考:使用sapply
代码,认识到i
是每个Var1
的值,但在内部,您将其视为该向量上的索引。您可能已经能够执行如下操作:sapply(seq_-along(x$Var1)[-1],function(i)log(x$Var1[i]/x$Var1[i-1])
,尽管出于前面答案中所述的原因,您需要预先编写一个NA
。(而且log
的矢量化使用要比sapply
或快得多。对于循环,尽可能/可用时使用矢量化函数。)谢谢你们,你们太棒了!你有包裹膨胀。。。这里使用的lag
是dplyr::lag
,而不是stats::lag
。如果您在不加载dplyr
(log(df1$Var1/stats::lag(df1$Var1))
的情况下进行尝试,您将得到所有零。(不幸的是,这是我倾向于直言不讳的一个原因,因为我已经被类似的灼伤过好几次。)@r2evans谢谢,没有注意到这一点。这是一个众所周知的冲突。我不知道我发现什么更令人恼火:事实上,stats::lag
没有达到我预期的效果(对于我的大多数使用),或者,dplyr
和friends与许多基本函数冲突,显著地重新定义了输出。(我相信有几个更好,但不是全部。)你的包裹膨胀。。。这里使用的lag
是dplyr::lag
,而不是stats::lag
。如果您在不加载dplyr
(log(df1$Var1/stats::lag(df1$Var1))
的情况下进行尝试,您将得到所有零。(不幸的是,这是我倾向于直言不讳的一个原因,因为我已经被类似的灼伤过好几次。)@r2evans谢谢,没有注意到这一点。这是一个众所周知的冲突。我不知道我发现什么更令人恼火:事实上,stats::lag
没有达到我预期的效果(对于我的大多数使用),或者,dplyr
和friends与许多基本函数冲突,显著地重新定义了输出。(我相信有几个更好,但不是全部。)