具有唯一名称的所有矢量值的平均值

时间:2011-04-10 08:08:43

标签: r

我有一个很大的非唯一命名值列表,即:

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 个答案:

答案 0 :(得分:6)

您最好的选择是在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 

答案 1 :(得分:5)

试试这个:

tapply(tscores, names(tscores), mean)

我注意到这是否更有效,但可能效率不高......

答案 2 :(得分:1)

嘿那里, 看起来你会多次对它进行子集化(也就是说,你不会从这个类型的许多元素中选择一次)。您的数据格式似乎并不适合此目的。因此,按名称列出值

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

这应该给你一个名为unique-tscore-name的tscore值数值向量的列表。然后,只要您需要选择名称的值,只需tvalues$name。这应该会破坏你的复杂性。为错误和错误假设道歉。