Возвращает несколько значений из функции 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"]