我有一个包含以下信息的数据集:
这里有一个玩具数据集来说明我的问题(性能数据完全没有意义,我只是选择了不同的整数来使示例易于理解。实际上,数据将是来自性能测量的浮点值):
workload cfg perf
1 a 1 1
2 b 1 2
3 a 2 3
4 b 2 4
5 a 3 5
6 b 3 6
7 a 4 7
8 b 4 8
您可以使用以下方式生成它:
dframe <- data.frame(workload=rep(letters[1:2], 4),
cfg=unlist(lapply(seq_len(4),
function(x) { return(c(x, x)) })),
perf=round(seq_len(8))
)
我正在尝试计算不同配置的谐波加速。为此需要基本配置(在此示例中为cfg = 1)。然后谐波加速计算如下:
num_workloads
HS(cfg_i) = num_workloads / sum (perf(cfg_base, wl_j) / perf(cfg_i, wl_j))
wl_j
例如,对于配置2,它将是:
HS(cfg_2) = 2 / [perf(cfg_1, wl_1) / perf(cfg_2, wl_1) +
perf(cfg_1, wl_2) / perf_cfg_2, wl_2)]
我想为每个工作负载对和配置计算谐波加速。通过使用示例数据集,结果将是:
workload.pair cfg harmonic.speedup
1 a-b 1 2 / (1/1 + 2/2) = 1
2 a-b 2 2 / (1/3 + 2/4) = 2.4
3 a-b 3 2 / (1/5 + 2/6) = 3.75
4 a-b 4 2 / (1/7 + 2/8) = 5.09
我正在与aggregate
和ddply
进行斗争,以便找到不使用循环的解决方案,但我无法提出可行的解决方案。所以,我面临的基本问题是:
我真的不知道如何使用某些R函数来表达它,例如aggregate
或ddply
(如果有可能的话)。
有谁知道如何解决这个问题?
编辑:我有点害怕使用1..8作为perf
会导致一些混乱。我这样做是为了简单起见,但是值不需要那些(例如,想象一下像这样初始化它们:dframe$perf <- runif(8)
)。詹姆斯和扎克的答案都明白我的部分问题是错误的,所以我认为最好在问题中澄清这一点。无论如何,我概括了两个答案来处理配置1的性能不是(1,2)
答案 0 :(得分:1)
试试这个:
library(plyr)
baseline <- dframe[dframe$cfg == 1,]$perf
hspeed <- function(x) length(x) / sum(baseline / x)
ddply(dframe,.(cfg),summarise,workload.pair=paste(workload,collapse="-"),
harmonic.speedup=hspeed(perf))
cfg workload.pair harmonic.speedup
1 1 a-b 1.000000
2 2 a-b 2.400000
3 3 a-b 3.750000
4 4 a-b 5.090909
答案 1 :(得分:1)
对于这样的问题,我喜欢“重塑”数据框,使用reshape2
包,为工作负载a提供一列,为工作负载b提供一列。然后使用向量运算比较2列很容易:
library(reshape2)
dframe <- dcast(dframe, cfg~workload, value.var='perf')
baseline <- dframe[dframe$cfg == 1, ]
dframe$harmonic.speedup <- 2/((baseline$a/dframe$a)+(baseline$b/dframe$b))
> dframe
cfg a b harmonic.speedup
1 1 1 2 1.000000
2 2 3 4 2.400000
3 3 5 6 3.750000
4 4 7 8 5.090909