【问题标题】:do.call in r with matrix and listsdo.call in r 与矩阵和列表
【发布时间】:2013-10-15 10:35:23
【问题描述】:

在语言 R 中,为了从旧矩阵 (N*3) 生成新矩阵 (N*6),有没有比下一个矩阵更好的方法,而无需“解包/取消列表”在 apply 函数中创建的内部列表是为了“扩展”源矩阵?

transformed <- matrix(byrow=T)
transformed <- as.matrix(
    do.call("rbind", as.list(
      apply(dataset, 1, function(x) {
         x <- list(x[1], x[2], x[3], x[2]*x[3], x[2]^2, x[3]^2)
      })
    ))
) 

#Unpack all inner lists from the expanded matrix
ret_trans <- as.matrix( apply(transformed, 2, function(x) unlist(x)) )

编辑:我添加一个例子

    dataset
     [,1] [,2] [,3]
[1,]    1    6   11
[2,]    2    7   12
[3,]    3    8   13
[4,]    4    9   14
[5,]    5   10   15

在应用上面的代码时,我想扩展为 N*6、5*6(对不起,我拼错了上面的列尺寸,以及 apply 函数的边距)应该是这样的

transformed
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1    6    11   66   36   121 
[2,] 2    7    12   84   49   144 
[3,] 3    8    13   104  64   169 
[4,] 4    9    14   126  81   196 
[5,] 5    10   15   150  100  225 

问题是是否有另一种方法可以做到这一点,而不必使用最后一个 apply 函数,而不必强制 x 成为一个列表 谢谢大家的回复

【问题讨论】:

  • 当您执行x[2]%*%x[3] 时,您期望会发生什么。你只是将两个标量相乘。为什么不使用x[2]*x[3]
  • 你的原始矩阵不是 N*3 而不是 N*2 像你说的那样吗? apply-ed MARGIN 应该是 1 而不是 2?你用一个小例子展示你的预期输出怎么样?看看cbind(x, x[,2]*x[,3], x[,2]^2, x[,3]^2)会不会...
  • @flodel 和 SimonO101 你说得对,叉积和边距一样是拼写错误,我在 R 的开头,抱歉所有错误
  • @DiegoJimenoPrieto 坚持下去,你会到达那里的。 +1 提供可重复的示例并花时间编辑您的问题。

标签: r list matrix


【解决方案1】:

按照 cmets 中的建议,执行以下操作:

cbind(dataset, dataset[,2] * dataset[,3], dataset[,c(2, 3)]^2)

这会比使用apply 快很多,应该是这样的:

transformed <- function(x) c(x[1], x[2], x[3], x[2]*x[3], x[2]^2, x[3]^2)
apply(dataset, 1, transformed)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2011-12-18
    • 2017-10-09
    • 2019-04-05
    • 2020-11-24
    • 2016-07-27
    • 2018-11-15
    相关资源
    最近更新 更多