在列表或中存储for函数的结果

时间:2015-05-26 22:30:07

标签: r list loops

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中,它可以打印结果,但我想在结果,数据框或列表中保存结果以进一步计算

提前致谢

4 个答案:

答案 0 :(得分:2)

尝试类似:

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)

答案 1 :(得分: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系列来执行此类任务。例如,如果要返回列表,请使用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

答案 2 :(得分:1)

使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

答案 3 :(得分:0)

将这两个结果与@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通常可以省去设置第0个案例对象然后递增计数器的工作。

> 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