我有一个很大的非唯一命名值列表,即:
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)
这对我需要的东西来说太慢了.我知道必须有一种更简单的方法来获得具有相同名称的所有值.
你最好的选择是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)
试试这个:
tapply(tscores, names(tscores), mean)
Run Code Online (Sandbox Code Playgroud)
我要注意这是否更有效,但可能效率不高......