Применить функцию в 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, Я надеюсь, что это помогает.

Другие вопросы по тегам