我正在使用
计算渐变值 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
答案 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)
如果排列观察结果,这个计算可以非常容易地进行矢量化。我使用head
和tail
删除前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