目标是将第二行与第一行进行比较并重复此操作。我的策略是在R.中对同一列向量执行两次单独的迭代
这是代码:
对于测试数据,数据长度为50
dat <- rnorm(50)
dat <- data.frame(dat)
函数
cv2 = function(a) {
for(i in 1:nrow(a)) {
for(j in 1:nrow(a)) {
iplus1 = next(a[j])
return((2*(abs((a[i])-(iplus1)))) / ((a[i])+(iplus1)))
}}}
输出应该创建一个范围在0-2之间的统计数据,并且长度等于49。到目前为止,此函数的返回值为NULL。如有任何帮助,我们将不胜感激。谢谢
所描述的计算实际上是对向量的计算。在R基地,你可以这样做:
cv2 = function(a){
n <- length(a)
2*abs((a[-1]-a[-n])/(a[-1]+a[-n]))
}
如果您想给它提供一列数据帧,则可以像cv2(dat[1,])
一样调用它。
在dplyr
软件包的帮助下,您可以尝试以下操作:
> library(dplyr)
> x <- rnorm(50)
> df <- data.frame(x)
> output <- df %>%
+ mutate(y = lag(x)) %>%
+ mutate(result = (2*abs(x-y)) / (x+y))
这会给你这样的结果:
x y result
1 -0.208826981 NA NA
2 -0.701317391 -0.208826981 -1.082225e+00
3 -0.740003385 -0.701317391 -5.368131e-02
4 -1.162325354 -0.740003385 -4.440052e-01
5 -0.133625594 -1.162325354 -1.587560e+00
6 -1.115008292 -0.133625594 -1.571930e+00
7 0.579094801 -1.115008292 -6.322301e+00
8 -1.194556141 0.579094801 -5.763647e+00
9 -0.131487021 -1.194556141 -1.603370e+00
10 0.646124908 -0.131487021 3.021977e+00
11 -0.551389477 0.646124908 2.528124e+01
不确定公式,但在baseR
中可以使用sapply
dat <- data.frame(col1 = rnorm(50), col2 = rnorm(50) )
dat$res <- sapply(1:nrow(dat), function(t) 2*(abs(dat[t,1]-dat[t,2])) / (dat[t,1]+dat[t,2]))
head(dat)
col1 col2 res
1 -0.62036668 0.45018710 -12.5814602
2 0.04211587 -0.01855983 5.1516048
3 -0.91092165 -0.31806837 -0.9647813
4 0.15802877 -0.92936215 -2.8195096
5 -0.65458464 -1.48746031 -0.7776454
6 1.76728727 -1.07519230 8.2141315