dplyr:通过函数传递数据框度量标准名称

时间:2017-02-18 13:53:41

标签: r dplyr

一些数据

rws <- 810
Sessions <- ceiling(rnorm(rws, mean = 3000, sd = 300))
Registrations <- ceiling(rnorm(rws, mean = 800, sd = 100))
anotherMetric <- ceiling(rnorm(rws, mean = 800, sd = 100))
Date_Range = seq(as.Date("2017-01-01"), as.Date("2017-01-30"), by = 1)
myDF <- data.frame(Sessions, Registrations, Date_Range, anotherMetric)

如果我想要按日期分组的函数并返回该日期的度量总和的总和,我想我想要这个:

metricByDate <- function(metric) {
  myDF %>%
    group_by(Date_Range) %>%
    summarise(metric = sum(metric))
}

然而,当我运行metricByDate(Sessions)时,我得到了:

> metricByDate(Sessions)
# A tibble: 30 × 2
   Date_Range  metric
       <date>   <dbl>
1  2017-01-01 2424188
2  2017-01-02 2424188
3  2017-01-03 2424188
4  2017-01-04 2424188
5  2017-01-05 2424188...

这里有两件事是错的:公制名称是“公制”而不是像我希望的那样“会话”。并且每个日期的指标总和看起来是相同的。事实上,它看起来像整个df的myDF $ Sessions的总和。

如何让我的函数获取度量标准名称的参数,然后按该度量标准进行分组和求和?

1 个答案:

答案 0 :(得分:2)

我使用data.tabledplyr所以这就是我要做的事情

加载data.table,转换myDF

R> library(data.table)
R> setDT(myDF)

使用data.table

诀窍是首先parse()一个文本变量,然后传递给eval()

R> txt <- parse(text="Registrations")
R> myDF[ , sum(eval(txt)), by=Date_Range][1:5]
   Date_Range    V1
1: 2017-01-01 21260
2: 2017-01-02 22104
3: 2017-01-03 21690
4: 2017-01-04 22052
5: 2017-01-05 22384

并非我只是故意展示前五行。

同样的事情,现在是Sessions专栏:

R> txt <- parse(text="Sessions") 
R> myDF[ , sum(eval(txt)), by=Date_Range][1:5]
   Date_Range    V1
1: 2017-01-01 83117
2: 2017-01-02 80279
3: 2017-01-03 84694
4: 2017-01-04 78528
5: 2017-01-05 80248
R> 

更好的是,您还可以一次性汇总所有列:

R> myDF[ , lapply(.SD,sum), by=Date_Range][1:5]
   Date_Range Sessions Registrations
1: 2017-01-01    83117         21260
2: 2017-01-02    80279         22104
3: 2017-01-03    84694         21690
4: 2017-01-04    78528         22052
5: 2017-01-05    80248         22384
R> 

另外,我在一开始就使用set.seed(123)来使这个可重现。