如何在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.:-)

  • 默认情况下,R的许多函数都是矢量化的,这意味着它们可以处理1个值、2个值或200万个值。这样做的一个好处是,您不需要显式地尝试循环或迭代,因此代码更简单。另一个好处是,当一个函数本机矢量化时,它通常(但并非总是)比手动迭代快得多

    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)
    

    df1
    x$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与许多基本函数冲突,显著地重新定义了输出。(我相信有几个更好,但不是全部。)