1

我正在尝试根据个人会议手段和 SD 为我正在使用的变量创建一个标准化值。我发现会议意味着使用该功能:

confavg=aggregate(base$AVG, by=list(base$confName), FUN=mean)

因此,在获得 31 次会议的平均值后,我想返回并为每个单独的球员输入这些平均值,这样我就可以轻松地根据会议平均值计算出标准化因子。

我试图创建大型 ifelse 或 if 语句,其中 confavg 是会议平均值。

ifelse((base$confName=="America East Conference"),confavg[1,2]->base$CAVG,0->base$CAVG)

但没有任何效果。理想情况下,我想让每个玩家都说:

Normalization = (player average - conference average)/conference standard deviation

我该怎么做呢?

编辑:

以下是一些示例数据:

AVG = c(.350,.400,.320,.220,.100,.250,.400,.450)
Conf = c("SEC","ACC","SEC","B12","P12","ACC","B12","P12")
Conf=as.factor(Conf)
sampleconfavg=aggregate(AVG, by=list(Conf), FUN=mean)
sampleconfsd=aggregate(AVG, by=list(Conf), FUN=sd)

所以每个球员都会有他们的平均值 - 会议平均值/会议的标准差

所以对于第一个人来说,这将是:

(.350 - .335) / 0.0212132 = 0.7071069

但我希望为我的数据集中的所有人构建一个函数。谢谢!

编辑2:

好吧,下面的答案很棒,但我(希望)遇到了最后一个问题。我想基本上对三个变量执行此过程,例如:

base3=do.call(rbind, by(base3, base3$confName, FUN=function(x) { x$ScaledAVG <- scale(x$AVG); x}))
base3=do.call(rbind, by(base3, base3$confName, FUN=function(x) { x$ScaledOBP <- scale(x$OBP); x}))
base3=do.call(rbind, by(base3, base3$confName, FUN=function(x) { x$ScaledK.AB <- scale(x$K.AB); x}))

哪个有效,但是当我搜索数据文件时:

base3[((base3$ScaledAVG>2)&(base3$ScaledOBP>2)&(base3$ScaledK.AB<.20)),]

它重置 Scaled K.AB 值并且不将其用作搜索参数的一部分。

4

1 回答 1

1

这是一个在 iris$Species 组中缩放 iris$Sepal.Length 的示例:

scaled.iris <- do.call(rbind, 
  by(iris, iris$Species,
     FUN=function(x) { x$Scaled.Sepal.Length <- scale(x$Sepal.Length); x }
  )
)

head(scaled.iris)
##          Sepal.Length Sepal.Width Petal.Length Petal.Width Species Scaled.Sepal.Length
## setosa.1          5.1         3.5          1.4         0.2  setosa          0.26667447
## setosa.2          4.9         3.0          1.4         0.2  setosa         -0.30071802
## setosa.3          4.7         3.2          1.3         0.2  setosa         -0.86811050
## setosa.4          4.6         3.1          1.5         0.2  setosa         -1.15180675
## setosa.5          5.0         3.6          1.4         0.2  setosa         -0.01702177
## setosa.6          5.4         3.9          1.7         0.4  setosa          1.11776320

编辑:

使用您的样本数据(Conf并且AVG仅):

d <- data.frame(Conf, AVG)
dd <- do.call(rbind, by(d, d$Conf, FUN=function(x) { x$Scaled <- scale(x$AVG); x}))

# Remove generated row names
rownames(dd) <- NULL

dd
##   Conf  AVG     Scaled
## 1  ACC 0.40  0.7071068
## 2  ACC 0.25 -0.7071068
## 3  B12 0.22 -0.7071068
## 4  B12 0.40  0.7071068
## 5  P12 0.10 -0.7071068
## 6  P12 0.45  0.7071068
## 7  SEC 0.35  0.7071068
## 8  SEC 0.32 -0.7071068
于 2013-03-23T20:36:34.090 回答