在R中创建/计算新的分组变量

时间:2015-02-25 10:28:37

标签: r

以下是我的数据集的样子:

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行的加速比。

2 个答案:

答案 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