在 R 中创建按列值分组的 Z-Score

Creating Z-Score grouped by column value in R

我想知道在 R 中是否有一种简单的方法来创建按列值分组的 Z 分数列。

比如像这样转动一个dataframe

  Obs      Year          Dollars
   1       1960            2
   2       1960            3
   3       1960            5
   4       1960            6
   5       1961           15
   6       1961           20 
   7       1961           25
   8       1961           40

变成这样

  Obs      Year          Dollars     Z-Score
   1       1960            2         -1.265
   2       1960            3         -0.633
   3       1960            5          0.633
   4       1960            6          1.266
   5       1961           15         -1.069
   6       1961           20         -0.535
   7       1961           25          0
   8       1961           40          1.604

其中样本按年份分隔

base R中很简单,直接用ave即可。

dat$Z.Score <- ave(dat$Dollars, dat$Year, FUN = scale)
dat
#  Obs Year Dollars    Z.Score
#1   1 1960       2 -1.0954451
#2   2 1960       3 -0.5477226
#3   3 1960       5  0.5477226
#4   4 1960       6  1.0954451
#5   5 1961      15 -0.9258201
#6   6 1961      20 -0.4629100
#7   7 1961      25  0.0000000
#8   8 1961      40  1.3887301

数据。

dat <-
structure(list(Obs = 1:8, Year = c(1960L, 1960L, 1960L, 1960L, 
1961L, 1961L, 1961L, 1961L), Dollars = c(2L, 3L, 5L, 6L, 15L, 
20L, 25L, 40L)), .Names = c("Obs", "Year", "Dollars"), class = "data.frame", row.names = c(NA, 
-8L))

编辑。
在评论中与 akrun 的讨论之后,我将 post 他的解决方案使用包 data.table。结果一样,只是结果的class不同,dat变成了class的对象data.table.

library(data.table)

setDT(dat)[, Z.Score := scale(Dollars), Year]