一些数据
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的总和。
如何让我的函数获取度量标准名称的参数,然后按该度量标准进行分组和求和?
答案 0 :(得分:2)
我使用data.table
多dplyr
所以这就是我要做的事情
myDF
R> library(data.table)
R> setDT(myDF)
诀窍是首先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)
来使这个可重现。