【问题标题】:Using do.call factor to scale - resetting value error使用 do.call 因子进行缩放 - 重置值错误
【发布时间】:2013-03-13 16:17:27
【问题描述】:

这是我在这里提出的问题的扩展: Getting Factor Means into the dataset after calculation

现在我已经基本标准化了我有兴趣使用的所有统计数据 我想搜索与这些相交的人的数据集。因此,我正在搜索这样的数据集:

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

寻找满足所有这三个条件的玩家,但是当我运行它时,它会将 Scaled K.AB 值重置为 0.5、1 或 2,然后不使用该参数进行搜索。以这种方式搜索数据集是否有问题,或者是否有更好的方法以同样的方式在数据集中查找人员?

这里是一些示例数据,但它与我查看我拥有的 4000 条记录时没有相同的问题:

AVG = c(.350,.400,.320,.220,.100,.250,.400,.450)
Conf = c("SEC","ACC","SEC","B12","P12","ACC","B12","P12")
OBP = c(.360,.420,.360,.260,.160,.260,.460,.410)
K.AB = c(.11,.10,.09,.25,.20,.19,.05,.09)
Conf=as.factor(Conf)
d<- data.frame(Conf, AVG,OBP,K.AB)
dd <- do.call(rbind, by(d, d$Conf, FUN=function(x) { x$Scaled <- scale(x$AVG); x}))
dd <- do.call(rbind, by(d, d$Conf, FUN=function(x) { x$Scaled <- scale(x$OBP); x}))
dd <- do.call(rbind, by(d, d$Conf, FUN=function(x) { x$Scaled <- scale(x$K.AB); x}))
dd[((dd$ScaledAVG>2)&(dd$ScaledOBP>2)&(dd$ScaledK.AB<.20)),]

谢谢!

【问题讨论】:

  • 您提供的样本数据几乎没用 - base3 是什么?你有confNameConf,没有Scaled 任何东西。请使其可重现。
  • 最后一个函数不会对这些数据做任何事情,但假设你有一堆并且值比平均值高出 2 sds,这是获取它们的最佳方法或存在有更好的方法吗?
  • 我重写了样本数据,我很抱歉不能让它重现!除了最后一部分之外,这应该都可以工作。
  • 您正在覆盖dd 的值。只有最后一个任务会保留下来。
  • 我应该如何将这三个一起做才能坚持下去?

标签: r search normalization r-factor do.call


【解决方案1】:

您可能希望放弃 do.call(rbind, by(...)) 策略,转而采用直接的scale 策略。 scale function has adata.frame` 方法。

> dd <- scale(d[ ,c("AVG", "OBP", "K.AB")])
> dd
             AVG        OBP       K.AB
[1,]  0.33566727  0.2348519 -0.3608439
[2,]  0.76878633  0.8281619 -0.5051815
[3,]  0.07579584  0.2348519 -0.6495191
[4,] -0.79044229 -0.7539981  1.6598820
[5,] -1.82992803 -1.7428481  0.9381942
[6,] -0.53057085 -0.7539981  0.7938566
[7,]  0.76878633  1.2237019 -1.2268693
[8,]  1.20190539  0.7292769 -0.6495191
attr(,"scaled:center")
    AVG     OBP    K.AB 
0.31125 0.33625 0.13500 
attr(,"scaled:scale")
       AVG        OBP       K.AB 
0.11544170 0.10112757 0.06928203 

> d[ dd[, 'AVG'] > 2 & dd[ ,'OBP'] >2 & dd[ ,'K.AB'] < 0.2 , ]
[1] Conf AVG  OBP  K.AB
<0 rows> (or 0-length row.names)

您没有得到满足所有这些条件的行应该不足为奇,因为在小型数据集中不太可能出现 2 的缩放值。

在 Conf 级别内应用比例:

> dd <- lapply(d[ ,c("AVG", "OBP", "K.AB")], function(x) ave(x, d[,"Conf"] , FUN=scale) )
> dd
$AVG
[1]  0.7071068  0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068  0.7071068  0.7071068

$OBP
[1]        NaN  0.7071068        NaN -0.7071068 -0.7071068 -0.7071068  0.7071068  0.7071068

$K.AB
[1]  0.7071068 -0.7071068 -0.7071068  0.7071068  0.7071068  0.7071068 -0.7071068 -0.7071068

> data.frame(dd)
         AVG        OBP       K.AB
1  0.7071068        NaN  0.7071068
2  0.7071068  0.7071068 -0.7071068
3 -0.7071068        NaN -0.7071068
4 -0.7071068 -0.7071068  0.7071068
5 -0.7071068 -0.7071068  0.7071068
6 -0.7071068 -0.7071068  0.7071068
7  0.7071068  0.7071068 -0.7071068
8  0.7071068  0.7071068 -0.7071068

我认为它在这里不太好用,因为提供的测试用例太小了。

【讨论】:

  • 这适用于我在这个问题中所说的,但是我们正在努力的主要目标是我们正在向会议平均值而不是整体平均值扩展。我们正在尝试规范他们参加哪个联赛的某些统计数据。有没有办法编辑您的代码以实现会议扩展? (会议是因子变量Conf。
  • 有没有办法将这些写入现有数据集?我已经尝试将它们作为 cbind(d,dd) 绑定在一起,但这并不能让我搜索。有没有办法使用 lapply 函数计算它,然后将它们附加到正确行中的数据集?就像对于每个单独的统计数据一样,我们仍然能够看到谁的平均值或 OBP 等更高,但如果没有连接这些值,我们将无法比较他们的缩放值。
  • 我不明白为什么 cbind(d,dd)-ing “不允许你搜索”。 avescale 都不会对行重新排序。
猜你喜欢
  • 2019-02-03
  • 2017-06-13
  • 2011-09-11
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 2017-10-15
相关资源
最近更新 更多