gpt4 book ai didi

R - "linearizing"tapply 的结果(到一个单一向量,按列解包)

转载 作者:行者123 更新时间:2023-12-02 07:37:42 24 4
gpt4 key购买 nike

在数据框中,我有一个包含一些值的向量,以及每个值所属类别的向量。我想对“按类别”运行的值应用一个函数,所以我使用 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

有什么建议吗?

谢谢,阿米特

最佳答案

主力 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 结合使用,您可以在一行代码中执行这两个操作。

关于R - "linearizing"tapply 的结果(到一个单一向量,按列解包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14711434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com