我有一个很大的非唯一命名值列表,即:
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)
对于我需要的东西来说,这太慢了。我知道必须有一种更简单的方法来获得具有相同名称的所有值。
答案 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
。这应该会破坏你的复杂性。为错误和错误假设道歉。