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

时间:2017-10-27 14:45:40

标签: r normalization

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

例如,转换像这样的数据框

  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

样品按年分隔

1 个答案:

答案 0 :(得分:1)

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

DATA。

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讨论之后,我将使用包data.table发布他的解决方案。结果是相同的,只有结果的类不同,dat成为类data.table的对象。

library(data.table)

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