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

Edd*_*Edd 3 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
Run Code Online (Sandbox Code Playgroud)

我希望能够更有效地提取与名称对应的所有值的子向量.目前,我正在使用:

u_tscores <- sapply(unique(names(tscores)), function(name, scores) {mean(scores[names(scores)==name])}, scores=tscores)
Run Code Online (Sandbox Code Playgroud)

这对我需要的东西来说太慢了.我知道必须有一种更简单的方法来获得具有相同名称的所有值.

Jor*_*eys 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 
Run Code Online (Sandbox Code Playgroud)

编辑:

system.time(X3 <- sapply(split(tscores,names(tscores)),mean))
   user  system elapsed 
   0.14    0.00    0.14 
Run Code Online (Sandbox Code Playgroud)


koh*_*ske 5

试试这个:

tapply(tscores, names(tscores), mean)
Run Code Online (Sandbox Code Playgroud)

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