我有一个问题,在最后四个小时内,我无法解决问题,所以我想知道你是否有人可以帮助我。要查看我的问题,让我们从一个示例开始:
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
命令将我的矩阵强制转换为数据帧,并根据我的因子获取数据帧的子集。有没有办法将所有内容重新组合在一起,以便保留初始行顺序?
请注意,与我的示例矩阵不同,我的实际数据集在列中没有有序值。
我真的很感激任何帮助!
答案 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])