2

在数据框中,我有一个带有一些值的向量,以及每个值所属的类别向量。我想将一个函数应用于“按类别”操作的值,所以我使用了tapply。例如,就我而言,我想重新调整每个类别中的值。

但是,tapply 的结果是重新缩放值的向量列表,但我需要统一(或“线性化”回)这个列表,所以我可以将重新缩放值的列添加到我的数据框中。

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

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

有什么建议么?

谢谢,阿米特

4

1 回答 1

7

主力的另一份工作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您可以在一行代码中完成这两项操作。

于 2013-02-05T15:54:05.893 回答