在 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]
我想知道在 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]