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

标签 r data.table

我最近一直在处理更大的数据集,并开始学习和迁移到 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/

相关文章:

r - data.table "out of range",如何将值添加到新行

r - 需要知道 R 中 predict() 和 predict.lm() 的区别

r - .SD 和 data.table 的其他类似特殊变量的命名空间环境是什么?

R数据表: label the counts of consecutive non-NA values

r - 使用自连接按组进行的第一次观察

R,data.table : How to assign values of some columns based on the names of other columns, 哪些存储在字符向量中?

python - 如何将过滤后的分组聚合的结果分配为原始 Pandas DataFrame 中的新列

r - 在 dplyr 中取消列出包含日期列表的列

javascript - 如何使项目符号逐渐出现在 RMarkdown 的 flexdashboard Storyboard中?

r - 将 R 中两个帧中的变量与循环进行比较