【问题标题】:R indexing a function under an if else statement inside a for loop and returning correct valuesR在for循环内的if else语句下索引函数并返回正确的值
【发布时间】:2020-03-29 15:04:25
【问题描述】:

我无法正确索引函数以使其返回正确的值。该函数仅在满足if 条件且ifelse 语句处于for 循环中时应用。

我已经简化了我的函数和数据集,以使示例在此处可重现 - 我目前编写它的方式不是很有效,但我只是想确保索引有效,以便我可以尝试将其应用到我的更多复杂的数据集,然后继续优化。

首先我从一些数据开始:

var1 <- seq(100, 500, 100)
matrix1 <- matrix(1:12, ncol=2)
matrix2 <- matrix(c(1,2,5,6,8,9,11,12,14,15,17,20), ncol=2)
matrix3 <- matrix(seq(1,34,3), ncol=2)
list1 <- list(matrix1, matrix2, matrix3)

我有一个接收如下数据框的函数:

func1 <- function(df1) {
  data1 <- df1[,1]
  data2 <- df1[,2]
  data3 <- vector()
  data3[i] <- sum(data1, data2)
  return(data3)
}

我的for 循环如下所示:

for (i in (1:3)) {
  vec1 <- var1
  vec2 <- diff(unlist(list1[[i]])[,1])
  df1 <- matrix()
  df1 <- cbind(vec1, vec2)
  len <- length(which(vec2<3))
  if (len>1) {
    func1(df1)
  }
  else data3 <- NA
  print(data3)
}

如果我的df1 通过了length 测试,并且如果它不满足长度要求,我想只应用func1,我想给它一个NA 值。

i=1len=5data3=1505时;当i=2len=4data3=1508;当i=3len=0 所以data3=NA。总之,我想从for循环返回的结果是data3 = c(1505, 1508, NA)

但是,我现在无法获得该结果,并且由于单独运行 i=1 i=2i=3 有效,我怀疑我遇到了索引问题(可能在 func1 内部)假设)但无法弄清楚。谁能给我一些建议?

【问题讨论】:

    标签: r for-loop if-statement indexing


    【解决方案1】:

    我稍微调整了循环语法:

    data3 <- vector(length = 3, mode = "numeric")
    for (i in 1:3) {
      vec1 <- var1
      vec2 <- diff(unlist(list1[[i]])[,1])
      df1 <- matrix()
      df1 <- cbind(vec1, vec2)
      len <- length(which(vec2<3))
      if (len>1) {
        v <- func1(df1)
        v <- v[!is.na(v)] #when i = 2, func1 returns a vector of length 2
        data3[[i]] <- v
      }
      else {
        data3[[i]] <- NA
      }
    }
    
    data3
    [1] 1505 1508   NA
    

    【讨论】:

      【解决方案2】:

      我认为你的函数 func1 有错字,应该是

      func1 <- function(df1) {
        data1 <- df1[,1]
        data2 <- df1[,2]
        data3 <- vector()
        data3 <- sum(data1, data2)
        return(data3)
      }
      
      
      data3 <- c()
      for (i in (1:3)) {
        vec1 <- var1
        vec2 <- diff(unlist(list1[[i]])[,1])
        df1 <- matrix()
        df1 <- cbind(vec1, vec2)
        len <- length(which(vec2<3))
        if (len>1) {
          r <- func1(df1)
        }
        else r <- NA
        data3 <- c(data3,r)
      }
      

      修复后,你会得到输出

      > data3
      [1] 1505 1508   NA
      

      【讨论】:

      • 我实际上认为我得到了 NA NA NA 的输出?我认为我应该将data3 的值“保存”到一个空向量中以将其导出到函数之外,这就是为什么我最初在函数内部的data3 中放置一个[i] 索引。
      • @Jennifer 查看我的更新,然后data3 保存每次迭代的值
      猜你喜欢
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多