【问题标题】:R, sapply does not seem to apply the function providedR, sapply 似乎没有应用提供的功能
【发布时间】:2019-05-09 21:25:08
【问题描述】:

查看 apply 函数系列,sapply 不会产生我想要的结果。我将问题简化为下面的基本示例。我创建一个向量,然后执行求和运算。

1.
v<-c(1:9)
sum(v)
#this returns 45 as expected

2.
sapply (v, sum)
#this returns [1] 1 2 3 4 5 6 7 8 9

我应该如何使用 sapply() 对上面的向量求和?非常感谢。

【问题讨论】:

  • 你不会,真的。如果您想要向量元素的总和,sapply 不是您想要的工具。你只想要sum(v)
  • 期望的输出是什么?你在找cumsum吗?
  • sapply(v, sum) 表示对v 的每个元素执行sum。所以你得到的结果是 [1] 的总和,[2] 的总和,等等。

标签: r


【解决方案1】:

sapply 将函数应用于列表的每个元素。因此,您在这里所做的就是将sum 单独应用于每个数字——这并没有起到任何作用。你可以在这个例子中看到发生了什么:

sapply(1:9, function(x) x + 1)
[1]  2  3  4  5  6  7  8  9 10

仅当您想对列表的多个元素求和时,使用 sumapply 才有意义:

sapply(list(1:9, 3:4), sum)
[1] 45  7

这里,sum 应用于列表中的每个向量

【讨论】:

    【解决方案2】:

    如果一定要用sapply,试试,

    sapply (list(v), sum)
    [1] 45
    

    函数sapply 将函数sum 应用于每个元素。所以对于向量v,它是对每个单独元素的求和。

    很明显,一个元素的总和就是那个元素。

    使用list 函数,我们将sum 函数应用于列表的第一个元素,即v,得到所需的结果。

    为了便于理解,我们可以使用任何函数将向量“下移一级”,例如data.frame

    > sapply(data.frame(v), sum)[[1]]
    [1] 45
    

    但在你的情况下,不需要sapply

    【讨论】:

      【解决方案3】:

      在这种情况下你会使用 reduce 函数

          v<-c(1:9)
          sum(v)
          #this returns 45 as expected
      
          purrr::reduce(v,sum)
          #this also returns 45
      
          # or base R
          Reduce(sum,v)
          # this also returns 45
      

      【讨论】:

      • 那是什么reduce? Base R 的Reduce 是大写。
      • library(purrr) 添加到您的答案中。这就是reduce 的来源。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2021-07-15
      • 1970-01-01
      • 2019-12-29
      • 2016-08-27
      • 1970-01-01
      相关资源
      最近更新 更多