R - “线性化”tapply的结果(到一个单独的向量,由列解包)

时间:2013-02-05 15:51:00

标签: r tapply

在数据框中,我有一个带有一些值的向量,以及每个值所属的类别向量。我想将一个函数应用于“按类别”操作的值,所以我使用tapply。例如,在我的情况下,我想重新缩放每个类别中的值。

但是,tapply的结果是重新调整后的值的向量列表,但我需要统一(或“线性化”)此列表,因此我可以将重新调整的值的列添加到我的数据框中。 / p>

我正在寻找一种简单的方法来做到这一点。这是一个样本:

x = 1:10
c = factor(c(1,2,1,2,1,2,1,2,1,2))
#I do the rescaling like this:
rescaled = tapply(x,list(c),function(x) as.vector(scale(x)))
# this look like this:
$`1`
[1] -1.2649111 -0.6324555  0.0000000  0.6324555  1.2649111

$`2`
[1] -1.2649111 -0.6324555  0.0000000  0.6324555  1.2649111


# but really, I need to get something like this
[1] -1.2649111 -1.2649111 -0.6324555 -0.6324555  0.0000000  0.0000000
 [7]  0.6324555  0.6324555  1.2649111  1.2649111

有什么建议吗?

感谢, 阿米特

1 个答案:

答案 0 :(得分:6)

主力的另一份工作ave。让我用数据框来说明它:

> mydf <- data.frame(x=1:10,myfac=factor(c(1,2,1,2,1,2,1,2,1,2)))
> within(mydf, scaledx <- ave(x,myfac,FUN=scale))
    x myfac    scaledx
1   1     1 -1.2649111
2   2     2 -1.2649111
3   3     1 -0.6324555
4   4     2 -0.6324555
5   5     1  0.0000000
6   6     2  0.0000000
7   7     1  0.6324555
8   8     2  0.6324555
9   9     1  1.2649111
10 10     2  1.2649111

如果您查看?ave,它会告诉您也可以使用一系列因素来执行此操作。如果要向数据帧添加列,这是您最简洁(尽管不是最快)的赌注。结合within,您可以在一行代码中执行这两项操作。