【问题标题】:Return multiple values from apply() function in R从 R 中的 apply() 函数返回多个值
【发布时间】:2012-09-06 12:52:25
【问题描述】:

我想从 apply() 函数返回多个值并将它们放在 R 中的单独列中,但我不断收到错误。我想做的是:

experiments$result1, experiments$result2, experiments$result3 <- apply(experiments, 1, 
function(row)
  #Some analysis here
  #return x, y, and z for column result1, result2, and result3
  x, y, z
)

也许这是解决问题的错误方法。实验是一个包含多列数据的数据框。我想添加作为每一行分析结果的列,但我不知道如何在没有循环的情况下执行此操作,这对于 R 来说不是惯用的。提前感谢您的帮助。

所以这里有一些更准确的代码。

experiments$result1, experiments$result2, experiments$result3 <- apply(experiments, 1, function(row)
  x <- row["startingTemp"]*2
  y <- row["startingTemp"]*3
  z <- row["startingTemp"]*4
  return (list(x, y, z))
)

“startingTemp”字段是我的“实验”数据框中的列之一。我收到“闭包”类型不是子集且找不到对象“z”的错误。

【问题讨论】:

  • 该函数为每个实验返回一个列表。

标签: r closures


【解决方案1】:

如果您要返回的三个值可以放入一个向量中(即它们不是某种复杂类型,如统计测试或拟合模型的结果),只需返回该向量,apply 将绑定它到一个 3xN 矩阵。

experiments$result <- apply(experiments, 1, function(row){
  x <- row["startingTemp"]*2
  y <- row["startingTemp"]*3
  z <- row["startingTemp"]*4
  c(x, y, z)
})
experiments$result1 <- experiments$result[1,]
experiments$result2 <- experiments$result[2,]
experiments$result3 <- experiments$result[3,]

如果您的三个返回值属于复杂类型(或不是标量),则将它们作为列表返回(如 Alan 建议的那样)并使用 lapply/sapply 提取它们。

experiment$result1 <- lapply(experiment$result, "[[", 1)

【讨论】:

    【解决方案2】:

    试试return(list(x=x,y=y,z=z))。对于每个实验,您都会返回一个包含 3 个值的列表。

    编辑

    该函数为每个实验返回一个列表。

    results <- apply(exp,1,function(x) return(list(x=x,y=x*2,z=x*3))) #results is a list of lists`
    experiment$res1 <- unlist(results)[attr(unlist(results),"names")=="x"]
    experiment$res2 <- unlist(results)[attr(unlist(results),"names")=="y"]
    experiment$res3 <- unlist(results)[attr(unlist(results),"names")=="z"]
    

    【讨论】:

    • 我在问题中添加了更多信息。我尝试了您的建议,但出现错误。
    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2011-06-12
    • 2012-09-30
    • 1970-01-01
    相关资源
    最近更新 更多