R中同一列的两次迭代



目标是将第二行与第一行进行比较并重复此操作。我的策略是在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

最新更新