Применить функцию в r (с матрицей и функцией)
Я пытаюсь сделать 3 строки и 8 столбцов матрицы с функцией apply, чтобы упростить код, но у меня есть проблема... Я должен сделать матрицу следующим образом:
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 4 3
[3,] 3 9 6
[4,] 4 16 10
[5,] 5 25 15
[6,] 6 36 21
[7,] 7 49 28
[8,] 8 64 36
x <- matrix(1:8,8,3)
x
m <- apply(x,2,function(z) return(c(z,z^2,(z^2+z)%/%2)))
m
2 ответа
Мы создаем list
функций и цикл по столбцам с for
цикл, примените соответствующие функции
f1 <- list(function(x) x, function(x) x^2, function(x) (x^2 + x)%/%2)
for(i in seq_len(ncol(x))) x[,i] <- f1[[i]](x[,i])
x
# [,1] [,2] [,3]
#[1,] 1 1 1
#[2,] 2 4 3
#[3,] 3 9 6
#[4,] 4 16 10
#[5,] 5 25 15
#[6,] 6 36 21
#[7,] 7 49 28
#[8,] 8 64 36
В решении ОП, apply
циклически перебирает каждый столбец, но каждая из функций применяется ко всем столбцам, и результаты объединяются.
apply
Функция применяет функцию к полям массива или матрицы. Вы используете apply
правильно, поэтому анонимная функция применяется к каждому столбцу входной матрицы и возвращает матрицу. Единственное, что столбцы вашей входной матрицы одинаковы, поэтому все столбцы в выходной матрице также будут одинаковыми.
Существует более простое решение для получения выходной матрицы:
x <- 1:8
f <- function(z) c(z,z^2,(z^2+z)%/%2)
m <- matrix(f(x), nrow = nrow(x), ncol = 3)
Хотя он не использует apply
, Я надеюсь, что это помогает.