Возвращает несколько значений из функции apply() в R

Я хочу вернуть несколько значений из функции 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))
)

поле "startTemp" является одним из столбцов в моем кадре данных "эксперименты". Я получаю ошибки, что тип "замыкание" не является подмножеством, а объект "z" не найден.

Ответ 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,]

Если три возвращаемых значения имеют сложный тип (или не скаляры), верните их в виде списка (например, предложенного Аланом) и извлеките их с помощью 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"]