13

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
)

たぶん、これは問題に対する間違ったアプローチです。Experiments は、複数のデータ列を含むデータ フレームです。各行の分析結果である列を追加したいのですが、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」フィールドは、「実験」データ フレームの列の 1 つです。タイプ「クロージャー」がサブセット化可能ではなく、オブジェクト「z」が見つからないというエラーが表示されます。

4

2 に答える 2

13

返したい 3 つの値をベクトルに入れることができる場合 (つまり、統計テストや適合モデルの結果のような複雑なタイプではない場合)、ベクトルを返すだけ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,]

3 つの戻り値が複雑な型 (またはスカラーではない) の場合は、それらをリストとして返し (Alan が提案したように)、lapply/で抽出しますsapply

experiment$result1 <- lapply(experiment$result, "[[", 1)
于 2012-09-06T14:59:08.383 に答える
3

試してみてくださいreturn(list(x=x,y=y,z=z))。実験ごとに、3 つの値のリストを返します。

編集

この関数は、実験ごとに 1 つのリストを返します。

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"]
于 2012-09-06T12:56:01.937 に答える