示例数据
set.seed(123)
library(dplyr)
Sessions <- ceiling(rnorm(50, mean = 3000, sd = 300))
Registrations <- ceiling(rnorm(50, mean = 800, sd = 100))
Conversions <- ceiling(rnorm(50, mean = 400, sd = 50))
Date_Range = seq(Sys.Date() - 50, Sys.Date() - 1, by = 1)
sample_data <- data.frame(Date_Range,Sessions, Registrations, Conversions)
sample_data <- tbl_df(sample_data)
功能:
dataByDates <- function(startDate, endDate, metric) {
filter(sample_data, Date_Range >= startDate & Date_Range <= endDate) %>% select_(metric)
}
尝试使用sum:
的函数sum(aggByDates(Sys.Date()-1, Sys.Date()-1, metric = "Sessions"))gives 2975.
到目前为止一切顺利。
可是:
> mean(aggByDates(Sys.Date()-10, Sys.Date()-1, metric = "Sessions"))
[1] NA
Warning message:
In mean.default(aggByDates(Sys.Date() - 10, Sys.Date() - 1, metric = "Sessions")) :
argument is not numeric or logical: returning NA
它是一套完整的数字数据,甚至不必使用na.rm = TRUE(我确实尝试了它的理智,添加na.rm + T从来没有区别)
见
> str(aggByDates(Sys.Date()-10, Sys.Date()-1, metric = "Sessions"))
Classes 'tbl_df', 'tbl' and 'data.frame': 10 obs. of 1 variable:
$ Sessions: num 2792 2938 2621 3651 3363 ...
和
> table(complete.cases(aggByDates(Sys.Date()-10, Sys.Date()-1, metric = "Sessions")))
TRUE
10
因此,如果我有完整的数字数据,为什么我会收到此错误,我该怎么办?
答案 0 :(得分:2)
问题是poo
无法处理数据框。错误与:
mean
mean(data.frame(A = 1:3))
[1] NA
Warning message:
In mean.default(data.frame(A = 1:3)) :
argument is not numeric or logical: returning NA
select 会返回一个数据框,但dplyr
没有为mean
的数据框定义,这里是关于参数 X :
一个R对象。目前存在用于数字/逻辑向量的方法 和日期,日期时间和时间间隔对象。复杂的载体是 仅允许trim = 0。
同样的原因?mean
工作正常,因为:
sum
的工作原理。 (这里的行为可能看起来不一致。)
如果您希望该功能适用于sum(data.frame(A = 1:3))
[1] 6
和sum
,更好的方法可能是从函数返回一个向量:
mean
现在,dataByDates <- function(startDate, endDate, metric) {
filter(sample_data, Date_Range >= startDate & Date_Range <= endDate)[[metric]]
}
和mean
都按预期工作:
sum
答案 1 :(得分:1)
我们可以提取列并获取mean
aggByDates(Sys.Date()-10, Sys.Date()-1, metric = "Sessions") %>%
.$Sessions %>%
mean
#[1] 2997.9