R:从矩阵到列表到矩阵:订单问题

时间:2013-08-03 12:58:08

标签: r list matrix row apply

我有一个问题,在最后四个小时内,我无法解决问题,所以我想知道你是否有人可以帮助我。要查看我的问题,让我们从一个示例开始:

tmp <- matrix(1:24, ncol=2)
fac <- rep(1:5, length.out=12)

根据因子级别fac,我想将函数应用于共享相同因子级别的tmp的所有元素。我最终使用by,但如果这不合适,请随时指出。

new <- by(tmp, fac, function(x) x <- x*sign(rbinom(1,1,.5)-0.5) )

这会将每个组乘以1或-1。

现在问题:我希望最终得到与之前相同的矩阵,即在我的例子中使用tmp(只是某些观察组已经乘以-1)。我尝试过以下方法:

new.tmp <- matrix(unlist(new), ncol=ncol(tmp))

但事实证明,行的顺序是混乱的。这是可以理解的,因为by命令将我的矩阵强制转换为数据帧,并根据我的因子获取数据帧的子集。有没有办法将所有内容重新组合在一起,以便保留初始行顺序?

请注意,与我的示例矩阵不同,我的实际数据集在列中没有有序值。

我真的很感激任何帮助!

1 个答案:

答案 0 :(得分:3)

我认为这应该有效:

tmp     = matrix(1:24, ncol=2)
fac     = rep(1:5, length.out=12)
new     = tapply(fac, fac, function(x) sign(rbinom(1,1,.5)-0.5) )

new.tmp = tmp*as.numeric(new[fac])