【问题标题】:Two iterations of the same column in RR中同一列的两次迭代
【发布时间】:2019-11-14 17:10:15
【问题描述】:

目标是将第二行与第一行进行比较并重复此操作。我的策略是对 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。任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • 不太确定您要做什么,但return 将在第一次通过循环时终止该函数。如果您要使用循环(可能不是最好的方法),您应该累积您尝试计算的内容,然后在循环后返回它。
  • 为什么你认为计算出来的数字的范围在0-2?
  • 0-2 范围在按组对数据进行子设置时具有生物学特异性。输出

标签: r for-loop iteration


【解决方案1】:

所描述的计算实际上是对向量的计算。在基础 R 中,您可以这样做:

cv2 = function(a){
  n <- length(a)
  2*abs((a[-1]-a[-n])/(a[-1]+a[-n]))
}

如果你想给它提供数据框的一列,然后像 cv2(dat[1,]) 一样调用它。

【讨论】:

    【解决方案2】:

    借助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
    

    【讨论】:

      【解决方案3】:

      不确定公式,但在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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 2014-06-30
        • 2018-06-10
        • 2021-04-29
        • 2011-04-29
        • 2022-11-04
        相关资源
        最近更新 更多