以下是我的数据集的样子:
cpus rows time
1 500 3
1 1000 10
1 2000 40
4 500 2
4 1000 6
8 500 1
8 1000 3
8 2000 10
8 3000 30
我想创建一个新的变量加速计算:
每行数量的时间(一个 cpu)/时间( n cpus)
所以,我应该最终得到这样的东西:
cpus rows time speedup
1 500 3 1
1 1000 10 1
1 2000 40 1
4 500 2 1.5
4 1000 6 1,67
8 500 1 3
8 1000 3 3.33
8 2000 10 4
8 3000 30 NA
我已经尝试使用aggregate()
,summaryBy()
和ddply()
来做到这一点 - 但我无法弄清楚如何计算其他内容,例如与他们的意思,虽然我认为可能有一个解决方案,其中至少有一个。
我如何在R?
中执行此操作澄清:我已经编辑了我的数据集示例,以使一点更清楚,有一些遗漏的案例,例如一个cpu和3000行可能没有任何情况,但是一个cpu的时间总是计算speedup变量的参考,并且必须始终连接到rows变量。因此,如果缺少这种情况(一个cpu,3000行),则无法计算8 cpus,3000行的加速比。
答案 0 :(得分:1)
你可以试试这个
mapply(FUN = '/' , df$time[df$cpus==1 ], df$time) # df your data.frame
# [1] 1.000000 1.000000 1.000000 1.500000 1.666667 1.600000 3.000000 3.333333 4.000000
# or simply
df$time[df$cpus==1 ]/df$time
如果你想把它写成分数,你可以使用 MASS 包中的分数。
答案 1 :(得分:1)
你可以这样做:
library(dplyr)
df %>% mutate(speedup = time[cpus == 1] / time)
你会得到:
# cpus rows time speedup
#1 1 500 3 1.000000
#2 1 1000 10 1.000000
#3 1 2000 40 1.000000
#4 4 500 2 1.500000
#5 4 1000 6 1.666667
#6 4 2000 25 1.600000
#7 8 500 1 3.000000
#8 8 1000 3 3.333333
#9 8 2000 10 4.000000
或者快速而肮脏的方式来获得所需的输出:
df %>% mutate(speedup = ifelse(time[cpus == 1]/time == 1, 1,
paste0(time[cpus == 1], "/", time)))
你会得到:
# cpus rows time speedup
#1 1 500 3 1
#2 1 1000 10 1
#3 1 2000 40 1
#4 4 500 2 3/2
#5 4 1000 6 10/6
#6 4 2000 25 40/25
#7 8 500 1 3/1
#8 8 1000 3 10/3
#9 8 2000 10 40/10