gpt4 book ai didi

r - 返回向量的 data.table 聚合,例如 scale()

转载 作者:行者123 更新时间:2023-12-01 02:26:38 25 4
gpt4 key购买 nike

我最近一直在处理更大的数据集,并开始学习和迁移到 data.table 以提高聚合/分组的性能​​。我一直无法按预期对某些表达式或函数进行分组。这是我遇到问题的基本按操作分组的示例。

library(data.table)
category <- rep(1:10, 10)
value <- rnorm(100)
df <- data.frame(category, value)
dt <- data.table(df)

如果我只想按类别计算每个组的平均值。这很容易工作。
dt[,mean(value),by="category"]

category V1
1: 1 -0.67555478
2: 2 -0.50438413
3: 3 0.29093723
4: 4 -0.41684790
5: 5 0.33921764
6: 6 0.01970997
7: 7 -0.23684245
8: 8 -0.04280998
9: 9 0.01838804
10: 10 0.44295978

如果我尝试使用 scale 函数甚至是一个简单的表达式从自身减去值,我就会遇到问题。分组被忽略,我将函数/表达式应用于每一行。以下返回所有 100 行,而不是按类别分组的 10 行。
dt[,scale(value),by="category"]


dt[,value-mean(value),by="category"]

我认为将比例重新创建为返回数字向量而不是矩阵的函数可能会有所帮助。
zScore <- function(x) {
z=(x-mean(x,na.rm=TRUE))/sd(x,na.rm = TRUE)
return(z)
}

dt[,zScore(value),by="category"]

category V1
1: 1 -1.45114132
2: 1 -0.35304528
3: 1 -0.94075418
4: 1 1.44454416
5: 1 1.39448268
6: 1 0.55366652
....
97: 10 -0.43190602
98: 10 -0.25409244
99: 10 0.35496694
100: 10 0.57323480
category V1

这还会返回应用于所有行 (N=100) 并忽略分组的 zScore 函数。为了让 scale() 或自定义函数在使用 mean() 时像上面那样使用分组,我缺少什么?

最佳答案

您已在评论中澄清您希望采用与以下相同的行为:

ddply(df,"category",transform, zscorebycategory=zScore(value))

这使:
    category       value zscorebycategory
1 1 0.28860691 0.31565682
2 1 1.17473759 1.33282374
3 1 0.06395503 0.05778463
4 1 1.37825487 1.56643607
etc

您提供的数据表选项提供:
     category          V1
1: 1 0.31565682
2: 1 1.33282374
3: 1 0.05778463
4: 1 1.56643607
etc

这是完全相同的数据。但是,您还想重复 value结果中的列,并重命名 V1具有更具描述性的变量。 data.table 为您提供结果中的分组变量,以及您提供的表达式的结果。因此,让我们修改它以提供您想要的行:

您的
dt[,zScore(value),by="category"]

变成:
dt[,list(value=value, zscorebycategory=zScore(value)),by="category"]

列表中的命名项成为结果中的列。
plyr = data.table(ddply(df,"category",transform, zscorebycategory=zScore(value)))
dt = dt[,list(value=value, zscorebycategory=zScore(value)),by="category"]
identical(plyr, dt)
> TRUE

(请注意,我将您的 ddply data.frame 结果转换为 data.table,以允许 identical 命令工作)。

关于r - 返回向量的 data.table 聚合,例如 scale(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15836452/

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