计算渐变时,sapply不会返回(数字)向量

时间:2016-06-02 17:09:03

标签: r sapply

我正在使用

计算渐变值
  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 

3 个答案:

答案 0 :(得分:2)

当所有返回值的长度为1时,您将只获得一个数字向量。更准确地说,如果所有返回值的长度相同,您将得到一个数组。来自?sapply&#34;详细信息&#34;:

  

简化&#39; sapply&#39;只有在&#39; X&#39;有长度   大于零,如果返回值来自所有元素   &#39; X&#39;都是相同的(正)长度。如果共同的长度   是一个结果是一个向量,如果大于一个是一个矩阵   列中对应于&#39; X&#39;。

的每个元素

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&#39; s intent)显示滞后1差异。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果排列观察结果,这个计算可以非常容易地进行矢量化。我使用headtail删除前2个和后2个观察值:

gradUx <- 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