【发布时间】: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-edMARGIN应该是1而不是2?你用一个小例子展示你的预期输出怎么样?看看cbind(x, x[,2]*x[,3], x[,2]^2, x[,3]^2)会不会... -
@flodel 和 SimonO101 你说得对,叉积和边距一样是拼写错误,我在 R 的开头,抱歉所有错误
-
@DiegoJimenoPrieto 坚持下去,你会到达那里的。 +1 提供可重复的示例并花时间编辑您的问题。