mean()在数字和完整数据上给出NA错误

时间:2017-03-06 03:15:50

标签: r

示例数据

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 

因此,如果我有完整的数字数据,为什么我会收到此错误,我该怎么办?

2 个答案:

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