R将行与所有行相加

时间:2015-06-19 18:00:54

标签: r

我正在尝试分析AB测试的网站数据。 我的参考点基于experimentName = Experiment 1(对照版本)

  experimentName UniquePageView UniqueFrequency NonUniqueFrequency
1   Experiment 1            459             294                359
2   Experiment 2            440             286                338
3   Experiment 3            428             273                348

我需要做的是在experimentName = Experiment 1

时对每个UniquePageView,UniqueFrequency和NonUniqueFrequency行求和

e.g。

UniquePageView WHERE experimentName = 'Experiment 1 ' +  UniquePageView WHERE experimentName = 'Experiment 2 ',
 UniquePageView WHERE experimentName = 'Experiment 1 ' +  UniquePageView WHERE experimentName = 'Experiment 3 '

等等(我可以进行无限次的实验#) 然后为UniqueFrequency和NonUniqueFrequency做同样的事情(我也可以有无限数量的列)

预期结果:

experimentName  UniquePageView  UniqueFrequency NonUniqueFrequency  Conversion Rate Pooled UniquePageView   Conversion Rate Pooled UniqueFrequency  Conversion Rate Pooled NonUniqueFrequency
1   Experiment 1    459 294 359 918 588 718
2   Experiment 2    440 286 338 899 580 697
3   Experiment 3    428 273 348 887 567 707

这是背后的数学:

    experimentName  UniquePageView  UniqueFrequency NonUniqueFrequency       Conversion Rate Pooled UniquePageView  Conversion Rate Pooled UniqueFrequency  Conversion Rate Pooled NonUniqueFrequency
1   Experiment 1    459 294 359 459 + 459   294 + 294   359 + 359
2   Experiment 2    440 286 338 459 + 440   294 + 286   359 + 338
3   Experiment 3    428 273 348 459 + 428   294 + 273   359 + 348

2 个答案:

答案 0 :(得分:2)

在基础R中,您可以通过列绑定(使用cbind)将初始数据帧添加到初始数据框以及仅与"实验1&#重复的版本,在一行中执行此操作34;行)。

cbind(dat, dat[,-1] + dat[rep(which(dat$experimentName == "Experiment 1"), nrow(dat)), -1])
#   experimentName UniquePageView UniqueFrequency NonUniqueFrequency UniquePageView UniqueFrequency
# 1   Experiment 1            459             294                359            918             588
# 2   Experiment 2            440             286                338            899             580
# 3   Experiment 3            428             273                348            887             567
#   NonUniqueFrequency
# 1                718
# 2                697
# 3                707

要更新末尾的列名(假设您将结果数据框存储在res中),您可以使用:

names(res)[4:6] <- c("CombinedPageView", "CombinedUniqueFrequency", "CombinedNonUniqueFrequency")

答案 1 :(得分:0)

你知道如何使用dplyr吗?如果你是R的新手,这是一个非常好的教训。 Dplyr包含函数filtersummarise,这些都是您解决此问题所需要的 - 非常简单!

首先,采取您的数据框

df

然后,仅过滤到您想要的数据,在本例中为experimentName = Experiment 1

df
df <- filter(df, experimentName == "Experiment 1")

现在,总结一下找到UniquePageView,UniqueFrequency和NonUniqueFrequency的总和

df
df <- filter(df, experimentName == "Experiment 1")
summarise(df, SumUniquePageView = sum(UniquePageView),
              SumUniqueFrequency = sum(UniqueFrequency),
              SumNonUniqueFrequency = sum(NonUniqueFrequency))

这将返回一个包含您正在寻找的答案的小表。对于稍微更高级(但更简单)的方法,您可以使用包magrittr中的管道运算符%>%。该代码借用了前一个语句中的对象,并将其用作诉讼语句中的第一个参数,如下所示:

df %>% filter(experimentName == "Experiment 1") %>% summarise(SumUniquePageView = sum(UniquePageView), etc)

如果您还没有这些套餐,可以使用install.packages("dpyr")library(dplyr)

获取这些套餐