2013-03-24 7 views
0

Это продолжение вопроса, который я спросил здесь: Getting Factor Means into the dataset after calculationИспользование do.call коэффициента масштабирования - сброс ошибки значение

Теперь, когда я в основном нормализуются все статы, что я заинтересован в использовании I хотите найти набор данных для людей, которые пересекаются с ними. Таким образом, я ищу набор данных, как это:

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)),] 

Спасибо!

+0

Данные примера, которые вы предоставляете, почти бесполезны - что такое 'base3'? У вас есть 'confName' и' Conf', а не 'Scaled'. Пожалуйста, сделайте это воспроизводимым. –

+0

Заключительная функция ничего не сделает по этим данным, но гипотетически, если у вас есть куча, и у вас есть значения, которые были на 2 sds выше среднего для них, это лучший способ добраться до них или есть ли лучшие способы сделать это? – BaseballR

+0

И я переписал образцы данных, извиняюсь за то, что не сделал его воспроизводимым! Это должно работать, за исключением финальной части. – BaseballR

ответ

0

Вы можете отказаться от do.call (rbind, by (...)) стратегии в пользу прямой стратегии scale. Метод data.frame` scale function has a.

> 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 

Я не думаю, что он работает слишком хорошо здесь, потому что предлагаемый тест слишком мал.

+0

Это работает для того, что я сказал в этой проблеме, но главное, над чем мы работаем, состоит в том, что мы масштабируемся в направлении средств конференции, а не общего среднего. Мы пытаемся нормализовать определенные статистические данные, с помощью которых они играют. Есть ли способ изменить код, чтобы перейти к масштабированию конференции? (Конференция является факторной переменной Conf. – BaseballR

+0

Есть ли способ записать их в существующий набор данных? Я попытался объединить их вместе как cbind (d, dd) в основном, но это не позволяет мне искать. Есть ли способ вычислить его с помощью функции lapply, а затем привязать их к набору данных в правильных строках? Как и для каждой отдельной статистики, мы все равно сможем увидеть, кто имеет более высокий средний или OBP и т. д., но не смогут сравнивать свои масштабированные значения без эти значения связаны. – BaseballR

+0

Я не понимаю, почему cbind (d, dd) -ing «не позволяет вам искать». Ни 'ave', ни' scale' не будут изменять порядок строк. –

 Смежные вопросы

  • Нет связанных вопросов^_^