【问题标题】:sapply doesn't return (numeric) vector when calculating gradientssapply 在计算梯度时不返回(数字)向量
【发布时间】:2016-06-05 03:27:02
【问题描述】:

我正在使用计算梯度值

  DF$gradUx <- sapply(1:nrow(DF), function(i) ((DF$V4[i+1])-DF$V4[i]), simplify = "vector") 

但是在检查class(DF$gradUx) 时,我仍然得到一个列表。我想要的是一个数字向量。我做错了什么?

Browse[1]> head(DF)
  V1 V2            V3           V4      
1  0  0 -2.913692e-09 2.913685e-09                          
2  1  0  1.574589e-05 3.443367e-09 
3  2  0  2.111406e-05 3.520451e-09 
4  3  0  2.496275e-05 3.613013e-09 
5  4  0  2.735775e-05 3.720385e-09 
6  5  0  2.892444e-05 3.841937e-09 

【问题讨论】:

  • 您会得到一个列表,因为并非所有返回的元素都具有相同的大小(我猜是第一个和最后一个)。在zoo 中使用rollapply 可能会更好

标签: r sapply


【解决方案1】:

只有当所有返回值的长度都为 1 时,您才会得到一个数值向量。更准确地说,如果所有返回值的长度相同,您将得到一个数组。来自?sapply“详情”:

只有在 'X' 有长度时才尝试在 'sapply' 中进行简化 大于零并且如果所有元素的返回值 'X' 的长度都相同(正)。如果共同长度 为一则结果为向量,如果大于一则为矩阵 有一列对应于“X”的每个元素。

i == 0 时,你的公式将返回numeric(0),所以整个返回将是一个列表。

您需要更改计算以考虑向量边界之外的索引。 DF$V4[1-1] 返回 numeric(0)DF$V4[nrow(DF)+1] 返回 NA。修正这个逻辑,你应该解决向量问题。

编辑:由于历史原因,原始问题错误地将差异计算为DF$V4[i+1])-DF$V4[i-1],给出了滞后 2 的差异,而最近编辑的问题(以及 OP 的意图)显示了滞后-1 差异。

【讨论】:

    【解决方案2】:

    我应该简单地使用diff(DF$V3) 而不是sapply 并将其写入新的data.frame:

    gradients = data.frame(gradUx=diff(DF$V3),gradUy=diff(DF$V4))
    

    【讨论】:

    • 我完全赞成回答您自己的问题,但这会产生与您的问题不同的差异。你的意思是diff(DF$V3, lag=2) 吗?如果问题得到解决,我还建议您接受此答案或其他答案之一。
    • 我的错误。梯度应该是一个简单的一阶除差,因此lag=1 和问题DF$V4[i+1]-DF$V4[i](已更正)。
    【解决方案3】:

    如果您排列观察结果,这个计算可以很容易地向量化。我使用 headtail 删除前 2 个和最后 2 个观察结果:

    gradUx &lt;- c(NA, tail(df$V4, -2) - head(df$V4, -2), NA)

    > gradUx
    [1]          NA 6.06766e-10 1.69646e-10 1.99934e-10 2.28924e-10          NA
    

    它以向量形式提供与您的方法相同的值:

    > sapply(1:nrow(df), function(i) ((df$V4[i+1])-df$V4[i-1]), simplify = "vector")
    [[1]]
    numeric(0)
    
    [[2]]
    [1] 6.06766e-10
    
    [[3]]
    [1] 1.69646e-10
    
    [[4]]
    [1] 1.99934e-10
    
    [[5]]
    [1] 2.28924e-10
    
    [[6]]
    [1] NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 2022-10-14
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2015-06-17
      • 2020-09-19
      相关资源
      最近更新 更多