【问题标题】:apply function in r (with matrix and function)在 r 中应用函数(带有矩阵和函数)
【发布时间】:2018-03-11 02:29:38
【问题描述】:

我正在尝试使用 apply 函数制作 3 行 8 列矩阵以简化代码,但我有问题... 我必须像这样制作矩阵:

    [,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

【问题讨论】:

  • 为什么不只是matrix(c(x[,1], x[,1]^2, ((x[,1]^2)+x[,1])%/%2), ncol = 3)?

标签: r matrix statistics


【解决方案1】:

我们创建一个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

在 OP 的解决方案中,apply 循环遍历每一列,但每个函数都应用于所有列并将结果连接起来。

【讨论】:

    【解决方案2】:

    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,但希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多