在数据框中,我有一个带有一些值的向量,以及每个值所属的类别向量。我想将一个函数应用于“按类别”操作的值,所以我使用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
有什么建议吗?
感谢, 阿米特
答案 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
,您可以在一行代码中执行这两项操作。