【问题标题】:storing results of a for function in list or将 for 函数的结果存储在列表中或
【发布时间】:2015-05-26 22:30:06
【问题描述】:
add <- c( 2,3,4)

for (i in add){
  a <- i +3
  b <- a + 3
  z <- a + b
  print(z)

}

# Result
        [1] 13
        [1] 15
        [1] 17

在 R 中,它可以打印结果,但我想将结果保存在向量、数据框或列表中以供进一步计算

提前致谢

【问题讨论】:

    标签: r list loops


    【解决方案1】:

    尝试类似:

    add <- c(2, 3, 4)
    
    z <- rep(0, length(add))
    
    idx = 1
    for(i in add) {
        a <- i + 3
        b <- a + 3
        z[idx] <- a + b
        idx <- idx + 1
    }
    
    print(z)
    

    【讨论】:

    • 好的,但是为什么不使用i 作为索引呢?这就是使用for 循环的全部意义所在。
    • 一开始真的没有理由使用循环。我只是想直接回答OP的问题。 i 也不能作为这里的索引 - 它是一个元素向量,可以对其执行操作。
    【解决方案2】:

    这是简单的代数,根本不需要for循环

    res <- (add + 3)*2 + 3 
    res
    ## [1] 13 15 17
    

    或者如果你想要data.frame

    data.frame(a = add + 3, b = add + 6, c = (add + 3)*2 + 3)
    #   a  b  c
    # 1 5  8 13
    # 2 6  9 15
    # 3 7 10 17
    

    虽然一般来说,当你尝试这样的事情时,最好创建一个函数,例如

    myfunc <- function(x) {
      a <- x + 3
      b <- a + 3
      z <- a + b
      z
    }
    
    myfunc(add)
    ## [1] 13 15 17
    

    如果实际需要循环(与您的示例不同)并且您想要存储其结果,最好使用*apply family 来执行此类任务。例如,如果您想返回一个列表,请使用lapply

    res <- lapply(add, myfunc)
    res
    # [[1]]
    # [1] 13
    # 
    # [[2]]
    # [1] 15
    # 
    # [[3]]
    # [1] 17
    

    如果您想要返回矢量,请使用sapply

    res <- sapply(add, myfunc)
    res
    ## [1] 13 15 17
    

    【讨论】:

      【解决方案3】:

      用于保存所有信息的 data.frame

      add <- c( 2,3,4)
      
      results <- data.frame()
      
      for (i in add){
        a <- i +3
        b <- a + 3
        z <- a + b
        #print(z)
        results <- rbind(results, cbind(a,b,z))
      }
       results
        a  b  z
      1 5  8 13
      2 6  9 15
      3 7 10 17
      

      如果你只想要 z 然后使用向量,不需要列表

      add <- c( 2,3,4)
      
      results <- vector()
      
      for (i in add){
        a <- i +3
        b <- a + 3
        z <- a + b
        #print(z)
        results <- c(results, z)
      }
      
      results
      [1] 13 15 17
      

      【讨论】:

      • 第二个起作用了,我正在做一个顺序刮,它没有占用数据帧。不管怎样,矢量给了我一个清单,休息一下,我把它扭曲成录取了:)
      【解决方案4】:

      将这两个结果与@dugar 的结果进行比较可能会有所启发:

      > sapply(add, function(x) c(a=x+3, b=a+3, z=a+b) )
        [,1] [,2] [,3]
      a    5    6    7
      b   10   10   10
      z   17   17   17
      

      这是惰性求值的结果,有时在计算中间值时会绊倒我们。下一个应该会给出更符合预期的结果:

      > sapply(add, function(x) c(a=x+3, b=(x+3)+3, z=(x+3)+((x+3)+3)) )
        [,1] [,2] [,3]
      a    5    6    7
      b    8    9   10
      z   13   15   17
      

      这些结果是@dugar 的转置。使用sapplylapply 通常可以节省您设置零个case 对象然后递增计数器的工作量。

      > lapply(add, function(x) c(a=x+3, b=(x+3)+3, z=(x+3)+((x+3)+3)) )
      [[1]]
       a  b  z 
       5  8 13 
      
      [[2]]
       a  b  z 
       6  9 15 
      
      [[3]]
       a  b  z 
       7 10 17 
      

      【讨论】:

        猜你喜欢
        • 2021-12-04
        • 2020-09-17
        • 1970-01-01
        • 1970-01-01
        • 2015-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-03
        相关资源
        最近更新 更多