Среднее из всех значений вектора с уникальными именами - PullRequest
3 голосов
/ 10 апреля 2011

У меня большой список неуникальных именованных значений, т. Е .:

tscores
        11461         11461         11461         11461         14433
-1.966196e+01  7.808853e-01  2.065178e+01  5.630565e+00 -7.295436e+00
        14433         14433         14433         14433         14433
 2.036339e+00 -6.704906e+00  1.603803e+00 -1.118324e+01  1.450554e+00
        14102         16153         16189         18563         18563
-1.137429e+01  7.053336e-02  1.011208e+00 -7.811194e+00 -6.749376e-01
        18563         18563         22042         22042         22042
 7.480217e-01 -9.909211e-01 -9.577424e-01 -7.887699e-02 -4.867706e-01

Я бы хотел иметь возможность более эффективно извлекать подвектор из всех значений, которые соответствуют имени На данный момент я использую:

u_tscores <- sapply(unique(names(tscores)), function(name, scores) {mean(scores[names(scores)==name])}, scores=tscores)

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

Ответы [ 3 ]

6 голосов
/ 10 апреля 2011

Лучшая ваша ставка - использовать lapply в списке, полученном split(tscores,names(tscores)).Выигрывает у вас примерно в пять раз быстрее:

n <- 1000000
tscores <- runif(n)
names(tscores) <- sample(letters,n,replace=T)

system.time(
   X <- tapply(tscores, names(tscores), mean)
)
   user  system elapsed 
   0.89    0.00    0.89 

 system.time(
   X2 <- sapply(unique(names(tscores)), function(name, scores){   
            mean(scores[names(scores)==name])}, scores=tscores)
)
   user  system elapsed 
   0.73    0.05    0.78 

system.time(
  X3 <- unlist(lapply(split(tscores,names(tscores)),mean))
)
   user  system elapsed 
   0.11    0.02    0.13 

РЕДАКТИРОВАТЬ:

system.time(X3 <- sapply(split(tscores,names(tscores)),mean))
   user  system elapsed 
   0.14    0.00    0.14 
5 голосов
/ 10 апреля 2011

попробуйте это:

tapply(tscores, names(tscores), mean)

Я уверен, что это более эффективно, но, вероятно, не менее эффективно ...

1 голос
/ 10 апреля 2011

Привет, кажется, вы будете использовать это подмножество несколько раз (то есть вы не будете выбирать из множества элементов этого типа только один раз каждый).Ваше форматирование данных не совсем похоже на эту цель.Так что перечислите значения по имени

tvalues <- sapply(unique(names(tscores)), function(x, tscores) as.numeric(tscores[names(tscores) == x])), tscores=tscores)

Это должно дать вам список числовых векторов со значением уникального tscore-name-named tscore value.Затем просто tvalues$name всякий раз, когда вам нужно выбрать значения имени.Это должно сбить порядок с вашей сложности.Извиняюсь за ошибки и ложные предположения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...