我想知道在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
样品按年分隔
答案 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]